2013-05-16 54 views
1

我试图创造出一个检查是否String包含包含在IEnumerable<String>。我的方法中的任何Strings的方法,到目前为止是这样的:C#StringComparer:可选参数默认

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.CurrentCulture ins't编译时间常数见下面的错误:

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

我的问题是,什么是我可以用CompareType这将导致在T可接受的默认值他相同的行为,如果它有可能默认为StringComparer.CurrentCulture

回答

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#中的参数名称开头小写字母(驼峰)

  3. 如果你有Linq,代码是甜如:

    return Fragments.Any(x => self.Contains(x, compareType)); 
    
+0

谢谢,我喜欢第一种方法的处理问题的方法,尤其是我不需要只用一种方法来实现它。 – HennyH

+0

重载与“框架一致”的部分原因是默认参数对于C#语言来说是相对较新的。在他们之前,所有的框架都使用重载,所以他们在为了向后兼容而引入默认参数后保留它们。 – dasblinkenlight

+0

@dasblinkenlight我同意,所以加1给你.. :)我个人喜欢并使用可选参数!我唯一讨厌的就是在intellisense中看到'[....]'括号! :) – nawfal

3

常用的技巧来处理非编译时常正在检查运行时,像这样:

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

你让null在方法签名的默认值,然后你检查的第一件事如果通过的值是null,则在此情况下用StringComparer.CurrentCulture代替它。请注意,为了使此技巧发挥作用,null一定不能是您合理想要传递给您的方法的有效参数,并且您的文档应该说通过null等同于通过StringComparer.CurrentCulture

+0

我学会了从你的答案新的东西 - - ''''操作符,我通常会使用'_? X:Y',谢谢你的回答! – HennyH

+0

@HennyH他们被称为[null-coalescing](http://msdn.microsoft.com/en-us/library/ms173224.aspx)运算符。几乎所有语言都是标准的东西。如果第一个参数为null,则返回第二个参数,否则返回第一个。看到这个问题,例如http://stackoverflow.com/questions/278703/unique-ways-to-use-the-null-coalescing-operator – nawfal