我正在尝试创建一个方法来检查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.CurrentCulture
没有编译时常量,如此错误所示:
> Error 1 Default parameter value for 'CompareType' must be a
> compile-time constant
我的问题是,我可以用于CompareType
的可接受的默认值是什么,这会产生相同的行为,就好像它可以默认为StringComparer.CurrentCulture
一样?
答案 0 :(得分: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
等同于传递{{ 1}}。
答案 1 :(得分: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;
}
建议:
使用bool
等语言别名而不是Boolean
。它推荐并使代码简短。
在C#中,参数名称以小写字母(camelCase)
如果你有Linq
,代码就像:
return Fragments.Any(x => self.Contains(x, compareType));