我的第一个扩展方法,可以写得更好吗?

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)

再次感谢你!

Joe*_*orn 7

是! 首先,您需要检查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)