2014-07-17 232 views
0

我有兩個列表中有不同類型的項目。它們的類型(Item1和Item2)都有一個名爲「Name」的屬性。我想遍歷list1中的所有項目。如果list1中的任何項目的名稱與列表2中的項目名稱相同,那麼我想將它添加到listWhereNamesMatch。檢查列表項是否包含另一個項目列表中的屬性

List<Item1> list1; 
List<Item2> list2; 
List<Item1> listWhereNamesMatch; 

foreach (var item1 in list1) 
{ 
    foreach (var item2 in list2) 
    { 
      if(item1.Name == item2.Name) 
      { 
       listWhereNamesMatch.add(item1); 
       break; 
      } 
    } 
} 

我有一個查詢,但我想知道是否有更清潔或更有效的方法來做到這一點。下面是我有:

var results = list1.FindAll(o => list2.FirstOrDefault(b => b.Name == o.Name) != null); 
listWhereNamesMatch.AddRange(results); 

回答

1

你可以嘗試以下操作之一:

var results = list1.Join(list2, x=> x.Name, y => y.Name, (x,y) => x); 
listWhereNamesMatch.AddRange(results); 

或以另一種形式:

var results = from a in list1 
       join b in list2 
       on a.Name equals b.Name 
       select a; 

listWhereNamesMatch.AddRange(results); 
1
var list1 = new List<MyItem>(); 
var list2 = new List<MyItem>(); 

var listWhereNamesMatch = list1.Intersect(list2); 


// implement IEquatable within your class 
class MyItem : IEquatable<MyItem> 
{ 
    public string Name { get; set; } 

    bool IEquatable<MyItem>.Equals(MyItem other) 
    { 
     return this.Name == other.Name; 
    } 
} 
+0

你的列表是一個字符串。如果你的列表是一個包含字符串屬性的對象呢? – jsirr13

+0

Intersect()將使用默認的相等比較器,根據我的經驗,它幾乎是基於聯接的方法的兩倍。 – andleer

+1

@ jsirr13更正爲更通用。 – andleer

相關問題