我正在尝试创建一个方法来检查String是否包含IEnumerable<String>.My方法中包含的任何Strings,到目前为止是这样的:
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的行为是一样的
发布于 2013-05-16 18:06:05
最简单、最干净、最一致的(对于框架)是重载:
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#参数名称中的Linq,代码就像:compareType)); Fragments.Any(x => self.Contains(x,return
发布于 2013-05-16 18:05:46
处理非编译时常量的一个常见技巧是将检查移到运行时,如下所示:
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。
https://stackoverflow.com/questions/16584460
复制相似问题