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

问题描述:

您有避免执行多个String.Equals的想法吗? 例如:C# - 将一个字符串变量与多个其他字符串进行比较(String.Equals)

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

谢谢!

+1

您可以创建一个字符串文字集合并检查该集合是否包含'interSubDir'。 – David

+1

您将不得不在每个目标点进行比较,无论是循环还是单独。你只是想让它更具可读性吗? –

+0

通常,当你检查X是否等于A,B,C,D等时,你必须检查每一个。没有真正的捷径。有时候,你可以把事情组合成一个数组,并使用'Any'来执行检查,但是如果你所做的取决于你正在检查的内容,那对你无能为力。 – Will

创造价值的集合:

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

Linq可以帮你。 listToChechAgainst可能是简单的变量或私人/公共财产。如下

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

,您可以使用:

var listToChechAgainst = new[] { "de", "DE-de" }; 

if(listToChechAgainst.Any(x => innerSubDir.Equals(x))); 

如果你只是想使其更具可读性,或者需要较少的打字,你可以写一个字符串扩展方法,像这样

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

或者

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

等。