C#StringComparer:可选参数默认值

C#StringComparer:可选参数默认值,c#,string,extension-methods,default-value,C#,String,Extension Methods,Default Value,我正在尝试创建一个方法来检查字符串是否包含IEnumerable中包含的任何字符串 public static Boolean ContainsAny(this String Self, IEnumerable<String> Fragments, StringComparer CompareType = StringComparer.CurrentCulture) { foreach (var fragment in Fragments) { if

我正在尝试创建一个方法来检查
字符串
是否包含
IEnumerable
中包含的任何
字符串

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

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

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

public static Boolean ContainsAny(
    this String self
,   IEnumerable<String> fragments
,   StringComparer comparerArg = null)
{
    var comparer = comparerArg ?? StringComparer.CurrentCulture;
    ...
}
public静态布尔ContainsAny(
这个字符串本身
,i无数碎片
,StringComparer comparerArg=null)
{
var comparer=comparerArg??StringComparer.CurrentCulture;
...
}

将方法签名中的默认值设置为
null
,然后首先检查传递的值是否为
null
,在这种情况下,将其替换为
StringComparer.CurrentCulture
。请注意,为了使此技巧起作用,
null
不能是一个合理地希望传递给方法的有效参数,您的文档应该说明传递
null
相当于传递
StringComparer。CurrentCulture

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

public static Boolean ContainsAny(
    this String self
,   IEnumerable<String> fragments
,   StringComparer comparerArg = null)
{
    var comparer = comparerArg ?? StringComparer.CurrentCulture;
    ...
}
public静态布尔ContainsAny(
这个字符串本身
,i无数碎片
,StringComparer comparerArg=null)
{
var comparer=comparerArg??StringComparer.CurrentCulture;
...
}

将方法签名中的默认值设置为
null
,然后首先检查传递的值是否为
null
,在这种情况下,将其替换为
StringComparer.CurrentCulture
。请注意,为了使此技巧起作用,
null
必须不是一个合理地希望传递给方法的有效参数,并且您的文档应该说明传递
null
等同于传递
StringComparer.CurrentCulture

最简单、最干净、最一致的(带框架)是要有重载:

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

谢谢,我喜欢第一种方法处理问题的方法,特别是因为我不需要只用一种方法来实现它。重载“与框架一致”的部分原因是默认参数对于C语言来说相对较新。在此之前,所有框架都使用重载,因此在引入默认参数以实现向后兼容性后,它们保留了重载。@dasblinkenlight我同意,所以加上1给您:)我个人喜欢并使用可选参数!我唯一讨厌它的是在intellisense中看到
[…]
括号!:)谢谢,我喜欢第一种方法处理问题的方法,特别是因为我不需要只用一种方法来实现它。重载“与框架一致”的部分原因是默认参数对于C语言来说相对较新。在此之前,所有框架都使用重载,因此在引入默认参数以实现向后兼容性后,它们保留了重载。@dasblinkenlight我同意,所以加上1给您:)我个人喜欢并使用可选参数!我唯一讨厌它的是在intellisense中看到
[…]
括号!:)我从你的回答中学到了一些新的东西——
??
操作符,我通常会使用`?X:Y`,谢谢你的回答@他们被称为接线员。几乎是跨语言的标准。如果第一个参数为null,则返回第二个参数,否则返回第一个参数。例如,看这个问题,我从你的回答中学到了一些新的东西--
操作符,我通常会使用`?X:Y`,谢谢你的回答@他们被称为接线员。几乎是跨语言的标准。如果第一个参数为null,则返回第二个参数,否则返回第一个参数。看看这个问题吧
return Fragments.Any(x => self.Contains(x, compareType));