C# – Unisci stringhe con un separatore, ignorando valori null e stringhe vuote

C# – Unisci stringhe con un separatore, ignorando valori null e stringhe vuote

Normalmente quando vuoi unire stringhe usando un separatore, useresti string.Join(). Tuttavia, il problema con string.Join() è che non ignora i valori null o le stringhe vuote. Dai un'occhiata ai seguenti esempi:

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

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

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

Se vuoi filtrare i valori null e le stringhe vuote, puoi filtrare tu stesso l'elenco delle stringhe e passarlo in string.Join(), in questo modo:

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

Nel resto di questo articolo, mostrerò il codice e i test per i metodi di supporto che avvolgono questa chiamata di join/filtro e mostrerò anche un approccio diverso che utilizza un metodo di estensione che gestisce solo due stringhe.

JoinFilter() – Unisci una o più stringhe, filtrando i valori null e le stringhe vuote

È una buona idea racchiudere il codice di unione/filtro in un metodo di supporto. Innanzitutto, potrebbe essere necessario utilizzare questa funzionalità in più punti del codice. In secondo luogo, semplifica le cose per il codice chiamante.

I seguenti metodi di supporto racchiudono i due overload più comuni di string.Join() e filtrano i valori null e le stringhe vuote:

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)

Questo filtra specificamente i valori null e le stringhe vuote, ma puoi personalizzarlo per filtrare tutte le stringhe desiderate. Potresti essere tentato di passare la funzione di filtraggio come parametro, ma a quel punto non serve avvolgere la chiamata. Consiglierei invece di aggiungere metodi che filtrino in modo specifico ciò di cui hai bisogno.

Ecco gli unit test parametrizzati per i due metodi 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)

Metodo di estensione Append():aggiungi una stringa a un'altra con un separatore, ignorando i valori null e le stringhe vuote

Nella sezione precedente, si noti che FilterJoin(…, params string[]) accetta un numero qualsiasi di singoli parametri di stringa. Può essere utilizzato per unire due stringhe. Mostrerò un approccio alternativo utilizzando un metodo di estensione di stringa che si occupa solo di aggiungere due stringhe.

Il codice seguente aggiunge due stringhe insieme a un separatore, ma solo se entrambe non sono nulle/vuote:

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)

Ecco gli unit test parametrizzati per 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)

Si noti che i casi di test sono gli stessi di FilterJoin().