【问题标题】:Using .Any from System.Linq on array to find a string在数组上使用 System.Linq 中的 .Any 来查找字符串
【发布时间】:2013-03-05 02:31:03
【问题描述】:

我正在尝试找出我的数组中的特定单元格是否包含给定字符串的一部分。由于数组不使用 .Contains,我使用的是 .Any,但似乎我对 .Any 工作原理的理解过于模糊,无法正确使用。

public void ProcessCSV (string typeName) {

    for (int y = 0; y < CSVReader.grid.GetUpperBound(1); y++) {
        if (CSVReader.grid[0,y] != null) {
            if ((CSVReader.grid[0,y].Any(s => typeName.Contains(s)))) {
                  // (add it to a new list)

所以我输入“Pork”、“Farm”等字符串。有时它似乎工作得很好,例如如果 typeName 是“Farm”,我只会从数组中取回包含 [0, y] 中的字符串的行。但在其他时候,如果我使用 Farm、另一个字符串或随机乱码,它只会返回包含任何字符串的每一行。

当我以这种方式调用 .Any 时实际发生了什么?我可以使用其他方法吗?

【问题讨论】:

    标签: c# arrays string linq


    【解决方案1】:

    你可能搞错了。

    Any 将返回一个布尔值,指示序列中的 any 元素是否满足条件。当您键入 Any(s =&gt; ...) 时,s 是要检查的序列中的元素。

    所以当你输入时:

    .Any(s => typeName.Contains(s))
    

    ...您实际上是在问:

    字符串typeName中是否包含序列中的任何元素?

    例如,如果typeNamePork,则Any() 只会在"Pork".Contains("ork") 时返回true。你的意思可能是相反的:

    .Any(s => s.Contains(typeName))
    

    any 元素是否包含字符串typeName

    所以"Pork and beef".Contains("Pork") 返回true


    如果您想要满足条件的序列中的 first 元素(而不是布尔真值),请使用 FirstOrDefault(或者,当您知道总是至少有一个时,您可以改用First)。例如:

    .FirstOrDefault(s => typeName.Contains(s))
    

    返回字符串typeName中包含的序列中的第一个元素;或者没有时的默认值。

    或者,反过来(我仍然认为你的意思):

    .FirstOrDefault(s => s.Contains(typeName))
    

    从包含字符串typeName的序列中返回第一个元素;或者没有时的默认值。

    【讨论】:

    • 呃,是的!这应该很明显;)但是以这种方式切换它又给了我一个错误,关于 .Contains ——也许是因为我不能将 .Contains 与数组一起使用,而 s 是数组的一部分?有什么好的办法吗?
    • 我得到的两个错误之一是:“类型char' does not contain a member Contains”和最佳扩展方法重载`System.Linq.Enumerable.Contains(this System.Collections. Generic.IEnumerable, string)' 有一些无效参数"
    • @ChrisMorrison 那么你应该更仔细地阅读你的错误。它表示您正在尝试在 char(单个字符)上调用 Contains。您显然期望 CSVReader.grid[0,y] 返回一个字符串,但情况并非(总是?)。使用String constructor 将您的单个char 或字符数组转换为字符串。
    猜你喜欢
    • 2015-12-31
    • 2020-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-20
    • 2014-05-27
    • 2016-06-07
    相关资源
    最近更新 更多