2013-10-02 65 views
1

假設的兩個陣列之間的任何比賽。LINQ表達式來尋找是否有我有一個字符串的兩份名單,<code>List1</code>和<code>list2</code>,其中<code>List1</code>是<code>Foo</code>類型的對象的列表中<code>fooList</code>一個屬性字符串

我想刪除給定的Foo,如果foo.List1中沒有任何字符串匹配 a la RemoveAll中的任何字符串。

我可以用嵌套的for循環做到這一點,但有沒有辦法用單一的漂亮的LINQ表達式來做到這一點?

囉嗦的代碼,建立一個新的列表,而不是從現有列表中刪除的東西:

  var newFooList = new List<Foo> 

      foreach (Foo f in fooList) 
      { 
       bool found = false; 

       foreach (string s in newFooList) 
       { 
        if (f.FooStringList.Contains(s)) 
        { 
         found = true; 
         break; 
        } 
       } 

       if (found) 
        newFooList.Add(f); 
      } 
+1

在我看來,你應該包含冗長的代碼,因爲它會比你的描述更好地傳達你想要的行爲。 –

回答

5

是:

var list2 = new List<string> { "one", "two", "four" }; 
var fooList = new List<Foo> { 
    new Foo { List1 = new List<string> { "two", "three", "five" } }, 
    new Foo { List1 = new List<string> { "red", "blue" } } 
}; 
fooList.RemoveAll(x => !x.List1.Intersect(list2).Any()); 
Console.WriteLine(fooList); 

基本上所有的魔法發生在RemoveAll:這不僅能消除項其中條目的List1屬性和list2(即,重疊)的交集是空的。

我親自找到!....Any()構建一種難以閱讀,所以我想手頭上有以下擴展方法:

public static class Extensions { 
    public static bool Empty<T>(this IEnumerable<T> l, 
      Func<T,bool> predicate=null) { 
     return predicate==null ? !l.Any() : !l.Any(predicate); 
    } 
} 

然後我可以重新寫入的方式,有點魔線更清晰:

fooList.RemoveAll(x => x.List1.Intersect(list2).Empty()); 
+0

不錯!這對我行得通。 –

相關問題