检查列表的项目是否具有包含在另一个项目列表中的属性

时间:2014-07-17 17:44:01

标签: c# linq list

我有两个列表,它们的项目类型不同。它们的类型(Item1和Item2)都有一个名为“Name”的属性。我想遍历list1中的所有项目。如果list1中的任何项目的名称与list2中的项目名称相同,那么我想将其添加到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);

2 个答案:

答案 0 :(得分: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 :(得分: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;
    }
}