C# – Verbinden Sie Zeichenfolgen mit einem Trennzeichen, wobei Nullen und leere Zeichenfolgen ignoriert werden

C# – Verbinden Sie Zeichenfolgen mit einem Trennzeichen, wobei Nullen und leere Zeichenfolgen ignoriert werden

Wenn Sie Zeichenfolgen mit einem Trennzeichen verbinden möchten, verwenden Sie normalerweise string.Join(). Das Problem mit string.Join() ist jedoch, dass es keine Nullen oder leere Zeichenfolgen ignoriert. Sehen Sie sich die folgenden Beispiele an:

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

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

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

Wenn Sie Nullen und leere Zeichenfolgen herausfiltern möchten, können Sie die Liste der Zeichenfolgen selbst filtern und wie folgt an string.Join() übergeben:

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

Im Rest dieses Artikels zeige ich Code und Tests für Hilfsmethoden, die diesen Join/Filter-Aufruf umschließen, und zeige auch einen anderen Ansatz, der eine Erweiterungsmethode verwendet, die nur mit zwei Zeichenfolgen umgeht.

JoinFilter() – Verbinden Sie einen oder mehrere Strings, wobei Nullen und leere Strings herausgefiltert werden

Es ist eine gute Idee, den Verknüpfungs-/Filtercode in eine Hilfsmethode einzuschließen. Erstens müssen Sie diese Funktionalität möglicherweise an mehreren Stellen in Ihrem Code verwenden. Zweitens vereinfacht es die Dinge für den aufrufenden Code.

Die folgenden Hilfsmethoden umschließen die beiden häufigsten Überladungen von string.Join() und filtern Nullen und leere Zeichenfolgen heraus:

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)

Dies filtert speziell Nullen und leere Zeichenfolgen heraus, aber Sie können es anpassen, um alle gewünschten Zeichenfolgen herauszufiltern. Sie könnten versucht sein, die Filterfunktion als Parameter zu übergeben, aber an diesem Punkt hat es keinen Sinn, den Aufruf zu umbrechen. Stattdessen würde ich empfehlen, Methoden hinzuzufügen, die speziell filtern, was Sie brauchen.

Hier sind die parametrisierten Unit-Tests für die beiden JoinFilter()-Methoden:

[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)

Append()-Erweiterungsmethode – Fügt einen String mit einem Trennzeichen an einen anderen an, wobei Nullen und leere Strings ignoriert werden

Beachten Sie im vorherigen Abschnitt, dass FilterJoin(…, params string[]) eine beliebige Anzahl einzelner Zeichenfolgenparameter akzeptiert. Es kann verwendet werden, um zwei Saiten zu verbinden. Ich zeige einen alternativen Ansatz mit einer Zeichenfolgenerweiterungsmethode, die sich nur mit dem Anhängen von zwei Zeichenfolgen befasst.

Der folgende Code hängt zwei Zeichenfolgen zusammen mit einem Trennzeichen an, aber nur, wenn sie nicht beide null/leer sind:

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)

Hier sind die parametrisierten Unit-Tests für 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)

Beachten Sie, dass die Testfälle dieselben sind wie die für FilterJoin().