C# - 将一个字符串变量与多个其他字符串进行比较(使用String.Equals)

5

你有什么想法可以避免多次使用 String.Equals 吗?例如:

if (interSubDir.Equals("de") || interSubDir.Equals("de-DE"))

谢谢!


1
你可以创建一个字符串字面量的集合,并检查该集合是否包含 interSubDir - David
1
你最终必须为每个目标进行比较,无论是在循环中还是单独进行。你只是想让它更易读吗? - Matthew Watson
通常,当你需要检查X是否等于A、B、C、D等时,你必须逐个进行检查。这里并没有真正的捷径。有时候,你可以将类似的事物分组成一个数组,并使用“Any”执行检查,但如果你所做的取决于你要检查的内容,那么它对你也没什么帮助。 - user1228
3个回答

10

如果你只是想让它更易读或者减少敲击量,你可以编写一个字符串扩展方法,如下所示:

public static class StringExt
{
    public static bool EqualsAnyOf(this string value, params string[] targets)
    {
        return targets.Any(target => target.Equals(value));
    }
}

您可以按如下方式使用:

if (interSubDir.EqualsAnyOf("de", "de-DE"))

或者

if (interSubDir.EqualsAnyOf("de", "de-DE", "en", "en-GB", "en-US"))

等等,等类似的事情。


6

创建值的集合:

string[] values = { "de", "de-DE" };

使用 Contains 方法:

if (values.Contains(interSubDir))

它提供了O(n)的性能。

如果你的集合非常大,那么你可以使用Array.BinarySearch方法,它提供了O(log n)的性能。

if (Array.BinarySearch(values, interSubDir) >= 0)

然而,首先必须对集合进行排序。

Array.Sort(values);

不要忘记导入 using System.Linq; - Renascent

1
Linq可能会有用。listToCheckAgainst可以是一个简单的变量或私有/公共属性。
var listToCheckAgainst = new[] { "de", "DE-de" };

if(listToCheckAgainst.Any(x => interSubDir.Equals(x)));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接