2013-03-05 25 views
1

我想知道我的數組中的特定單元格是否包含給定字符串的一部分。由於數組不使用.Contains我正在使用.Any,但似乎我對如何理解。任何作品都太朦朧,無法正確使用。使用.Any從System.Linq數組中找到一個字符串

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,另一個字符串或隨機亂碼,它只會返回每一行都有任何字符串。

當我打電話時實際發生了什麼?以這種方式?有一些替代方法可以使用嗎?

回答

4

你可能有錯誤的方法。

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的序列中的第一元素;或者沒有時的默認值。

+0

呃,是啊!這應該是顯而易見的;)但以這種方式切換它給我一個錯誤,關於.Contains - 也許是因爲我不能使用.Contains與數組,並且S是數組的一部分?有沒有什麼好辦法解決這個問題? – 2013-03-05 02:45:57

+0

我得到的兩個錯誤之一是這樣的:「類型'char'不包含成員'Contains'和最好的擴展方法重載'System.Linq.Enumerable.Contains (This System.Collections.Generic.IEnumerable ,string)'有一些無效參數「 – 2013-03-05 02:48:26

+0

@ChrisMorrison然後你應該更仔細地閱讀你的錯誤。它表示你正試圖在'char'(一個字符)上調用'Contains'。您顯然希望'CSVReader.grid [0,y]'返回一個字符串,但這不是(總是?)的情況。使用['String'構造函數](http://msdn.microsoft.com/zh-cn/library/ttyxaek9.aspx)將單個「char」或字符數組轉換爲字符串。 – Virtlink 2013-03-05 10:50:02

相關問題