2012-05-22 120 views
2

我陷入了一個簡單的場景。我有一個List<string>對象,它的所有項目均具有主體:將foreach循環更改爲LINQ查詢

item_1_2_generatedGUID //generatedGUID is Guid.NewGuid() 

但可能有更多的數字 item_1_2_3_4_5_generatedGUID

現在

,我不知道如何改變這種循環到LINQ的查詢。有任何想法嗎 ?

string one = "1"; //an exaplme 
    string two = "2"; //an exaplme 

    foreach (var item in myStringsList) 
    { 
     string[] splitted = item.Split(new char[] { '_' }, 
            StringSplitOptions.RemoveEmptyEntries); 

     if(splitted.Length >= 3) 
     { 
      if(splitted[1] == one && splitted[2] == two) 
      { 
       resultList.Add(item); 
      } 
     } 
    } 
+0

您可以用'重新sharper'並檢查它是否暗示什麼:) – sarwar026

回答

2

試試這個:

var query = from item in myStringsList 
      let splitted = item.Split(new[] { '_' }, SSO.RemoveEmptyEntries) 
      where splitted.Length >= 3 
      where splitted[1] == one && splitted[2] == two 
      select item; 

var resultList = query.ToList(); 
+0

我認爲splitted將是字符串類型...他想要的是檢查數組的長度。 – ivowiblo

+0

@ivowiblo:'splitted'的類型是'string []'。這是'item.Split'的返回值。 – dtb

+0

@ivowiblo:爲什麼它應該是字符串類型?由於'Split'返回字符串數組,'splitted'應該是字符串數組,不是嗎?糾正我,如果我錯了。 – sarwar026

4
var result = from s in lst 
      let spl = s.Split('_') 
      where spl.Length >= 3 && spl[1] = one && spl[2] == two 
      select s; 
+0

而且值的檢查 – ivowiblo

+0

@ivowiblo,我起初誤讀了這個問題,看到我的更新。 –

2

這是一種不同的方法:

var items = myStringsList. 
      Where(x => x.Substring(x.IndexOf("_")).StartsWith(one+"_"+two+"_")); 

你可能需要在加的IndexOf一個+1,但我不確定。

它是什麼:

  • 刪除的第一個項目(這是爲子)。在你的例子中,它應該是「1_2_3_4_5_generatedGUID」
  • 檢查字符串是否以你所期望的開始。在您的例子:1_2_
+0

好戲訣竅:) +1 –

0

編輯:增加了對任何事物的模式在第一個「位置」

var result = items.Where(i => Regex.IsMatch(i, "^[^_]_1_2_")); 
+0

我不認爲從'item_'開始,它只是樣本。 –

+0

@SaeedAmiri:如果是這樣的話,只需用[^ _]替換項目 – Codism

+0

我對正則表達式一無所知:)但我認爲編輯答案會更好。 –