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

Chr*_*son 1 c# linq arrays string

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

所以,我喂像"猪肉"的字符串,"农超对接"等.有时它似乎很好地工作,例如,如果typeName为"农场"我只拿回从数组行,其中包括在[0,Y]该字符串.但在其他时候,如果我使用Farm,另一个字符串或随机乱码,它只返回任何字符串的任何一行.

我打电话的时候实际发生了什么.这样吗?我可以使用一些替代方法吗?

Dan*_*ker 5

你可能有错误的方法.

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

所以当你输入:

.Any(s => typeName.Contains(s))
Run Code Online (Sandbox Code Playgroud)

......你基本上是在问:

任何字符串中包含的从序列元素typeName

例如,如果typeNamePork,Any()则仅在返回true时返回"Pork".Contains("ork").你可能反过来说的意思是:

.Any(s => s.Contains(typeName))
Run Code Online (Sandbox Code Playgroud)

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

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


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

.FirstOrDefault(s => typeName.Contains(s))
Run Code Online (Sandbox Code Playgroud)

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

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

.FirstOrDefault(s => s.Contains(typeName))
Run Code Online (Sandbox Code Playgroud)

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