【问题标题】:Checking if a list's item has a property contained in another list of items检查列表的项目是否具有包含在另一个项目列表中的属性
【发布时间】:2014-07-18 02:29:09
【问题描述】:

我有两个列表,它们的项目类型不同。它们的类型(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);

【问题讨论】:

    标签: c# linq list


    【解决方案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);
    

    【讨论】:

      【解决方案2】:
      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;
          }
      }
      

      【讨论】:

      • 您的列表是字符串。如果您的列表是包含字符串属性的对象怎么办?
      • Intersect() 将使用默认的相等比较器,根据我的经验,它几乎是基于连接的方法的两倍。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      相关资源
      最近更新 更多