2

如何从 2 个不同的列表中提取找到以下表达式的所有元素

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

以及如何通过提取主列表中缺少的元素来做相反的事情

!(List1.id = List2.id && List1.CategoryId = list2.CategoryId)
4

3 回答 3

3

您可以为您的数据类型实现一个简单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);
      } 
  }
于 2013-01-10T16:19:37.010 回答
2

您也可以使用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();
于 2013-01-10T16:27:27.097 回答
2

所以第一种情况是你的基本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);
    }
}
于 2013-01-10T16:31:41.963 回答