【问题标题】:Linq contains confusionLinq 包含混淆
【发布时间】:2023-03-29 17:15:01
【问题描述】:

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

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

上面的代码没有编译,出现以下错误:

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

如果我删除 using linq 语句,它对包含感到满意(但会阻止所有 linq 代码)。

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

干杯

【问题讨论】:

  • 这个标题读错了会更有趣。
  • 哈哈是真的。我想标题比问题本身更有智慧。

标签: c# linq


【解决方案1】:

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

【讨论】:

【解决方案2】:

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

没有接受StringComparisionString.Contains 重载。你可能想使用String.IndexOf(string, StringComparison):

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

      • 字符串是IEnumerable&lt;char&gt;
      • 这行不通。 string 没有实现 IEnumerable&lt;string&gt;
      • 来晚了,但这仍然不起作用。 Comparer&lt;T&gt;没有实现IEqualityComparer&lt;T&gt;,所以第二个参数的类型还是错误的。似乎没有与StringComparer 等效的char,所以如果您想使用此扩展方法,您可能必须实现自己的比较器
      猜你喜欢
      • 2017-09-24
      • 2011-01-29
      • 2013-03-21
      • 1970-01-01
      • 1970-01-01
      • 2013-07-20
      • 1970-01-01
      • 2017-11-03
      • 2013-12-17
      相关资源
      最近更新 更多