两个列表之间的区别
我有两个通用清单填写CustomsObjects。
我需要检索这两个列表(第一个没有第二个项目的项目)之间的区别。
我在想使用.Except()
是一个好主意,但我不明白如何使用这个..帮助!
使用Except
正确的路要走。 如果你的types覆盖Equals
和GetHashCode
,或者你只对引用types相等感兴趣(即两个引用只在引用完全相同的对象时才“相等”),则可以使用:
var list3 = list1.Except(list2).ToList();
如果您需要expression一个自定义的平等想法,例如通过ID,则需要实现IEqualityComparer<T>
。 例如:
public class IdComparer : IEqualityComparer<CustomObject> { public int GetHashCode(CustomObject co) { if (co == null) { return 0; } return co.Id.GetHashCode(); } public bool Equals(CustomObject x1, CustomObject x2) { if (object.ReferenceEquals(x1, x2)) { return true; } if (object.ReferenceEquals(x1, null) || object.ReferenceEquals(x2, null)) { return false; } return x1.Id == x2.Id; } }
然后使用:
var list3 = list1.Except(list2, new IdComparer()).ToList();
编辑:如注释中所述,这将删除任何重复的元素; 如果您需要保留重复项,请告诉我们…从list2
创build一个集合并使用如下所示的内容可能是最简单的:
var list3 = list1.Where(x => !set2.Contains(x)).ToList();
你可以做这样的事情:
var result = customlist.Where(p => !otherlist.Any(l => p.someproperty == l.someproperty));
var third = first.Except(second);
(如果不喜欢引用懒惰集合,也可以在Except()
ToList()
之后调用ToList()
。)
如果要比较的值是基本数据types,例如int
, string
, decimal
等,则Except()
方法使用默认比较器比较值。
否则,将通过对象地址进行比较,这可能不是您想要的。在这种情况下,使您的自定义对象实现IComparable
(或实现自定义IEqualityComparer
并将其传递给Except()
方法)。
如果两个列表都实现IEnumerable接口,则可以使用LINQ来实现这一点。
list3 = list1.where(i => !list2.contains(i));
由于Except扩展方法在两个IE枚举上运行,在我看来这将是一个O(n ^ 2)操作。 如果性能是一个问题(如果说你的列表很大),我build议从list1创build一个HashSet并使用HashSet的ExceptWith方法。
有点晚,但这里是我的工作解决scheme
var myBaseProperty = (typeof(BaseClass)).GetProperties();//get base code properties var allProperty = entity.GetProperties()[0].DeclaringType.GetProperties();//get derived class property plus base code as it is derived from it var declaredClassProperties = allProperty.Where(x => !myBaseProperty.Any(l => l.Name == x.Name)).ToList();//get the difference
在上面提到的代码中,我得到了我的基类和派生类列表之间的属性差异
List<int> list1 = new List<int>(); List<int> list2 = new List<int>(); List<int> listDifference = new List<int>(); foreach (var item1 in list1) { foreach (var item2 in list2) { if (item1 != item2) listDifference.Add(item1); } }