在数组上使用System.Linq中的.Any来查找字符串

时间:2013-03-05 02:31:04

标签: c# arrays string linq

我试图找出我的数组中的特定单元格是否包含给定字符串的一部分。因为数组不使用.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)

所以我用“猪肉”,“农场”等字符串喂食。有时看起来效果很好,例如如果typeName是“Farm”,我只返回数组中包含[0,y]中该字符串的行。但在其他时候,如果我使用Farm,另一个字符串或随机乱码,它只会返回任何字符串的任何一行。

当我打电话时实际发生了什么。以这种方式?我可以使用其他方法吗?

1 个答案:

答案 0 :(得分:5)

你可能有错误的方法。

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

所以当你输入:

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

...你基本上是在问:

  

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

例如,如果typeNamePorkAny()只会在true时返回"Pork".Contains("ork")。你可能反过来意味着它:

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

任何元素是否包含字符串typeName

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


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

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

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

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

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

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