Nic*_*len 6 c# extension-methods c#-3.0
因为这是我第一次尝试使用对我来说非常有用的扩展方法,我只是想确保我走的是正确的路线
public static bool EqualsAny(this string s, string[] tokens, StringComparison comparisonType)
{
foreach (string token in tokens)
{
if (s.Equals(token, comparisonType))
{
return true;
}
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
叫做
if (queryString["secure"].EqualsAny(new string[] {"true","1"}, StringComparison.InvariantCultureIgnoreCase))
{
parameters.Protocol = Protocol.https;
}
Run Code Online (Sandbox Code Playgroud)
编辑:一些很好的建议,正是我正在寻找的东西.谢谢
编辑:
我已决定以下实施
public static bool EqualsAny(this string s, StringComparison comparisonType, params string[] tokens)
{
// for the scenario it is more suitable for the code to continue
if (s == null) return false;
return tokens.Any(x => s.Equals(x, comparisonType));
}
public static bool EqualsAny(this string s, params string[] tokens)
{
return EqualsAny(s, StringComparison.OrdinalIgnoreCase, tokens);
}
Run Code Online (Sandbox Code Playgroud)
我更喜欢在IEnumerable上使用params,因为它简化了调用代码
if (queryString["secure"].EqualsAny("true","1"))
{
parameters.Protocol = Protocol.https;
}
Run Code Online (Sandbox Code Playgroud)
与以前相去甚远
if (queryString["secure"] != null)
{
if (queryString["secure"] == "true" || queryString["secure"] == "1")
{
parameters.Protocal = Protocal.https;
}
}
Run Code Online (Sandbox Code Playgroud)
再次感谢你!
是! 首先,您需要检查s为null.另外,让它接受任何IEnumerable<string>令牌而不仅仅是一个数组,然后使用其他linq运算符进行检查:
public static bool EqualsAny(this string s, IEnumerable<string> tokens, StringComparison comparisonType)
{
if (s== null) return false;
return tokens.Any(t => s.Equals(t, comparisonType));
}
Run Code Online (Sandbox Code Playgroud)
考虑如何处理nulls 的值,还有第三个选项尚未使用:
public static bool EqualsAny(this string s, IEnumerable<string> tokens, StringComparison comparisonType)
{
if (s== null) return tokens.Any(t => t == null);
return tokens.Any(t => s.Equals(t, comparisonType));
}
Run Code Online (Sandbox Code Playgroud)
最后,关于你选择的实现:如果你将要有重载,你也可能有IEnumerable重载,并让你的params代码调用它们.
小智 5
public static bool EqualsAny(
this string s,
StringComparison comparisonType,
params string[] tokens)
{
foreach (string token in tokens)
{
if (s.Equals(token, comparisonType))
{
return true;
}
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
使用params,您不必先将字符串强制转换为数组.
var match = "loool".EqualsAny(StringComparison.Ordinal, "hurf", "Durf");
Run Code Online (Sandbox Code Playgroud)
Linq-ified(JC + me)与NRE(框架标准):
public static bool EqualsAny(
this string s,
StringComparison comparisonType,
params string[] tokens)
{
if(s == null) throw new NullReferenceException("s");
return tokens.Any(x=> s.Equals(x, comparisonType));
}
Run Code Online (Sandbox Code Playgroud)