Linq包含混乱

时间:2010-02-02 16:48:33

标签: c# linq

我注意到linq和Contains方法有些奇怪。似乎对要调用的Contains方法感到困惑。

if (myString.Contains(strVar, StringComparison.OrdinalIgnoreCase))
{
  // Code here                  
}

以上代码无法编译,并出现以下错误:

无法从用法推断出方法'System.Linq.Enumerable.Contains(System.Collections.Generic.IEnumerable,TSource,System.Collections.Generic.IEqualityComparer)'的类型参数。尝试明确指定类型参数。

如果我删除了使用linq语句,它对contains感到满意(但是会对所有linq代码进行制动)。

告诉编译器我想使用String.Contains方法而不是Linqs的正确语法是什么?

干杯

4 个答案:

答案 0 :(得分:7)

这是因为BCL中没有定义String.Contains(string, StringComparison)方法,编译器尝试使用扩展方法。只定义了String.Contains(string)方法。

答案 1 :(得分:2)

  

告诉编译器我想使用String.Contains方法而不是Linqs的正确语法是什么?

String.Contains没有超载接受StringComparision。您可能想要使用String.IndexOf(string, StringComparison)

// s is string
if(s.IndexOf(strVar, StringComparison.OrdinalIgnoreCase) >= 0) {
    // code here
}

答案 2 :(得分:1)

可能是因为string.Contains方法只接受一个参数(string; string.Contains没有重载需要StringComparison值,而Enumarable.Contains {1}}扩展方法需要两个。但是,您提供的参数不符合预期的输入类型,因此编译器会感到困惑。

答案 3 :(得分:0)

正如Darin Dimitrov所说,String.Contains(string, StringComparison)作为String类型的方法不存在。

然而,

System.Linq.Enumerable确实包含这样的签名。而string也是IEnumerable<char>,这就是编译器混淆的原因。如果你用Char的ICompar- er 替换StringCompar- ison ,你实际上可以利用Linq并进行编译:

if (myString.Contains(strVar, Comparer<Char>.Default))
{
    // Code here                  
}