1

我正在尝试创建一个方法来检查 a 是否String包含任何Strings包含在 . 中的内容。IEnumerable<String>到目前为止,我的方法是这样的:

public static Boolean ContainsAny(this String Self, IEnumerable<String> Fragments, StringComparer CompareType = StringComparer.CurrentCulture)
{
    foreach (var fragment in Fragments)
    {
        if (Self.Contains(fragment,CompareType))
        {
            return true;
        }
    }
    return false;
}

但是,这不会编译,因为StringComparer.CurrentCultureins 不是此错误所示的编译时间常量:

> Error 1   Default parameter value for 'CompareType' must be a
> compile-time constant

我的问题是,我可以使用的可接受的默认值是什么,CompareType这将导致与可以将其默认为相同的行为StringComparer.CurrentCulture

4

2 回答 2

3

处理非编译时常量的一个常见技巧是将检查移至运行时,如下所示:

public static Boolean ContainsAny(
    this String self
,   IEnumerable<String> fragments
,   StringComparer comparerArg = null)
{
    var comparer = comparerArg ?? StringComparer.CurrentCulture;
    ...
}

null在方法签名中设置默认值,然后您检查的第一件事是传递的值是否为null,在这种情况下,您将其替换为StringComparer.CurrentCulture. 请注意,为了使这个技巧起作用,null它不能是一个有效的参数,一个人会合理地想要传递给你的方法,并且你的文档应该说 passnull相当于pass StringComparer.CurrentCulture

于 2013-05-16T10:05:45.507 回答
2

最简单、最干净和一致(与框架)是重载:

public static Boolean ContainsAny(this String Self, IEnumerable<String> Fragments)
{
    returns ContainsAny(Self, Fragments, StringComparer.CurrentCulture);
}

public static Boolean ContainsAny(this String Self, IEnumerable<String> Fragments, StringComparer CompareType)
{
    foreach (var fragment in Fragments)
    {
        if (Self.Contains(fragment,CompareType))
        {
            return true;
        }
    }
    return false;
}

如果您只想要一个过载,那么可能是:

public static Boolean ContainsAny(this String Self, IEnumerable<String> Fragments, StringComparer CompareType = null)
{
    if (CompareType == null)
        ComapreType = StringComparer.CurrentCulture;

    foreach (var fragment in Fragments)
    {
        if (Self.Contains(fragment,CompareType))
        {
            return true;
        }
    }
    return false;
}

建议:

  1. 使用语言别名bool代替Boolean. 推荐它并使代码简短。

  2. 在 C# 中,参数名称以小写 (camelCase) 开头

  3. 如果你有Linq,代码就像:

    return Fragments.Any(x => self.Contains(x, compareType));
    
于 2013-05-16T10:06:05.430 回答