2014-12-28 43 views
1

我正在使用以下代碼來篩選包含字符串的列表pre。 我錯過了什麼? 下面是代碼Linq包含不工作

string pre = "a"; 
List<string> A = new List<string>(); 
List<string> B = new List<string>(); 
DAL dal = new DAL(); 
A = dal.GetNames(); 
B = (from x in A 
    where A.Contains(pre) 
    select x).ToList(); 
B = A.Where(c => A.Contains(pre)).ToList(); 

B的總是來這裏爲空(在兩種情況下)。

回答

2

如預期的原因有兩個,您的代碼不起作用。

  1. 這聽起來像你想匹配基於您的搜索條件(變量pre)各列表項的任意子串,但你對每個條目的精確匹配當前搜尋。因此,您當前的代碼不會返回任何內容,因爲列表A不包含任何僅爲「a」的字符串。
  2. 您的lambda表達式可能是錯誤的,因爲它們引用的是A的整個實例,而不是當前正在評估的A條目。

要解決1),而不是Contains,使用IndexOf列表來評估每個字符串,因此精確匹配不是必需的,它只是看起來的搜索條件匹配的任何,在每個字符串的任何地方名單。

要修正2),請理解在lambda表達式中,左側的變量指的是正在迭代的當前的項目。所以給出一個列表x 1,2,3,4,5,如果我的表達式是n => n > 2,那意味着在迭代中這個表達式被評估5次,並且n是1,2,3,4或5. On這些數字中的每一個,表達式都是n> 2?被評估,導致列表中每個條目的值爲真或假。在你的代碼中,你沒有使用引用當前正在表達式中迭代的列表項的變量,因此評估與當前條目無關 - 所有評估都將返回相同的結果,例如,如果我更改了原始條目表達式爲n => 2 > 1,則該表達式中的所有項目評估爲true

解決此問題很簡單,如其他答案所示 - 在您的表達式中,使用lambda表達式左側的變量而不是引用其他範圍之外的列表。

string pre = "a"; 
List<string> A = new List<string>(); 
List<string> B = new List<string>(); 

A = new List<string>() { "a", "ba", "bb", "bc" }; 

B = (from x in A 
     where x.IndexOf(pre) > -1 
     select x).ToList(); 

B = A.Where(c => c.IndexOf(pre) > -1).ToList(); 
6

我想你想要做的是找到列表中包含單詞pre的所有項目? 在這種情況下,應該改變這樣的:

B = (from x in A 
    where A.Contains(pre) 
    select x).ToList(); 

B = (from x in A 
    where x.Contains(pre) 
    select x).ToList(); 

你的LINQ查詢只有當預列表

0

變化的精確匹配返回非空的結果你查詢到:

  1. 部分不同
  2. 不區分大小寫

    B = (from x in A 
         where x.IndexOf(pre, StringComparison.CurrentCultureIgnoreCase) != -1 
         select x).ToList();