C#:une cadenas con un separador, ignorando los valores nulos y las cadenas vacías

C#:une cadenas con un separador, ignorando los valores nulos y las cadenas vacías

Normalmente, cuando desea unir cadenas usando un separador, usaría string.Join(). Sin embargo, el problema con string.Join() es que no ignora los valores nulos o las cadenas vacías. Echa un vistazo a los siguientes ejemplos:

string.Join(" - ", null, null) //returns " - "

string.Join(" - ", "test", null) //returns "test - "

string.Join(" - ", "test", "") // returns "test - "
Code language: C# (cs)

Si desea filtrar los valores nulos y las cadenas vacías, puede filtrar la lista de cadenas usted mismo y pasarla a string.Join(), así:

string.Join(" - ", listOfStrings.Where(s => !string.IsNullOrEmpty(s)))
Code language: C# (cs)

En el resto de este artículo, mostraré el código y las pruebas para los métodos auxiliares que envuelven esta llamada de unión/filtro, y también mostraré un enfoque diferente que usa un método de extensión que solo trata con dos cadenas.

JoinFilter():une una o más cadenas, filtrando nulos y cadenas vacías

Es una buena idea envolver el código de unión/filtro en un método auxiliar. Primero, es posible que deba usar esta funcionalidad en varios lugares de su código. En segundo lugar, simplifica las cosas para el código de llamada.

Los siguientes métodos auxiliares envuelven las dos sobrecargas más comunes de string.Join() y filtran los valores nulos y las cadenas vacías:

using System.Collections.Generic;
using System.Linq;

public static class StringUtil
{
	public static string JoinFilter(string separator, IEnumerable<string> strings)
	{
		return string.Join(separator, strings.Where(s => !string.IsNullOrEmpty(s)));
	}
	public static string JoinFilter(string separator, params string[] str)
	{
		return string.Join(separator, str?.Where(s => !string.IsNullOrEmpty(s)));
	}
}
Code language: C# (cs)

Esto filtra específicamente los valores nulos y las cadenas vacías, pero puede personalizarlo para filtrar las cadenas que desee. Puede tener la tentación de pasar la función de filtrado como un parámetro, pero en ese momento no tiene sentido envolver la llamada. En su lugar, recomendaría agregar métodos que filtren específicamente lo que necesita.

Estas son las pruebas unitarias parametrizadas para los dos métodos JoinFilter():

[DataRow(null, null, "")]
[DataRow("", "", "")]
[DataRow("A", null, "A")]
[DataRow(null, "A", "A")]
[DataRow("A", "B", "A - B")]
[TestMethod()]
public void TestJoinFilter_WithList(string a, string b, string expectedString)
{
	//act
	var joinedString = StringUtil.JoinFilter(" - ", new List<string>() { a, b });

	//assert
	Assert.AreEqual(expectedString, joinedString);
}

[DataRow(null, null, "")]
[DataRow("", "", "")]
[DataRow("A", null, "A")]
[DataRow(null, "A", "A")]
[DataRow("A", "B", "A - B")]
[TestMethod()]
public void TestJoinFilter_WithStringParams(string startingString, string appendString, string expectedString)
{
	//act
	var appendedString = StringUtil.JoinFilter(" - ", startingString, appendString);

	//assert
	Assert.AreEqual(expectedString, appendedString);
}
Code language: C# (cs)

Método de extensión Append():agrega una cadena a otra con un separador, ignorando los valores nulos y las cadenas vacías

En la sección anterior, observe que FilterJoin(…, params string[]) acepta cualquier cantidad de parámetros de cadena individuales. Se puede utilizar para unir dos cadenas. Mostraré un enfoque alternativo utilizando un método de extensión de cadena que solo se ocupa de agregar dos cadenas.

El siguiente código agrega dos cadenas junto con un separador, pero solo si ambas no son nulas/vacías:

public static class StringExtensions
{
	public static string Append(this string appendTo, string appendString, string separator)
	{
		if (string.IsNullOrEmpty(appendString))
		{
			return appendTo ?? "";
		}
		else if (string.IsNullOrEmpty(appendTo))
		{
			return appendString;
		}

		return string.Join(separator, appendTo, appendString);
	}
}
Code language: C# (cs)

Estas son las pruebas unitarias parametrizadas para Append():

[DataRow(null, null, "")]
[DataRow("", "", "")]
[DataRow("A", null, "A")]
[DataRow(null, "A", "A")]
[DataRow("A", "B", "A - B")]
[TestMethod()]
public void TestAppend(string startingString, string appendString, string expectedString)
{
	//act
	var appendedString = startingString.Append(appendString, " - ");

	//assert
	Assert.AreEqual(expectedString, appendedString);
}
Code language: C# (cs)

Tenga en cuenta que los casos de prueba son los mismos que los de FilterJoin().