通过比较两个属性值从列表1中选择存在于列表2中的元素的Linq

本文关键字:列表 存在 选择 于列表 Linq 元素 比较 两个 属性 | 更新日期: 2023-09-27 17:51:11

如何从2个不同的列表中提取出下面表达式所在的所有元素

List1.id = List2.id && List1.CategoryId = list2.CategoryId

以及如何通过提取主列表

中缺失的元素来进行反向操作
!(List1.id = List2.id && List1.CategoryId = list2.CategoryId)

通过比较两个属性值从列表1中选择存在于列表2中的元素的Linq

您可以为您的数据类型实现一个简单的IComparer并使用

 var intersection = List1.Intersect(List2, myCategoryIdComparer);
 var notRepeating = List1.Union(List2).Except(intersection);
 var notInList1 = List2.Except(List1, myCategoryIdComparer);

您可以轻松实现IComparer:

 public class CategoryComparer : IComparer  { 
          int IComparerList1.CompareIntersect( Object x, Object y )  {
          // do some type checks to make sure both are CategoryObject
          return ((CategoryObject)x).CategoryID
              .Compare(((CategoryObject)y).CategoryIdmyCategoryIdComparer);
      } 
  }

所以第一种情况是你的基本Join操作,Linq支持:

var matchingItems = from item1 in list1
            join item2 in list2
            on new{ item1.id, item1.CategoryId} 
            equals new{ item2.id, item2.CategoryId}
            select new { item1, item2 };

第二种情况:

var idValues = list2.Select(item => new { item.id, item.CategoryId })
    .ToHashSet();
var missingItems = list1.Where(item => !idValues.Contains(new { item.id, item.CategoryId }));

以下是ToHashSet的定义:

public static class Extensions
{
    public static HashSet<T> ToHashSet<T>(this IEnumerable<T> source)
    {
        return new HashSet<T>(source);
    }
}

您也可以使用join子句,尽管它将要求您初始化许多匿名类型。

var result = (from l1 in list1
              join l2 in list2 on new {l1.Id, l1.Category} 
              equals new {l2.Id, l2.Category}
              select l1).ToArray();