我试图找出我的数组中的特定单元格是否包含给定字符串的一部分。因为数组不使用.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,另一个字符串或随机乱码,它只会返回任何字符串的任何一行。
当我打电话时实际发生了什么。以这种方式?我可以使用其他方法吗?
答案 0 :(得分:5)
你可能有错误的方法。
Any
将返回一个布尔值,指示序列中的任何元素是否满足条件。当您键入Any(s => ...)
时,s
是要检查的序列中的元素。
所以当你输入:
.Any(s => typeName.Contains(s))
...你基本上是在问:
字符串
typeName
中包含的序列中是否有任何元素?
例如,如果typeName
为Pork
,Any()
只会在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
的序列中返回第一个元素;或没有时的默认值。