两个列表之间的区别

我有两个通用清单填写CustomsObjects。

我需要检索这两个列表(第一个没有第二个项目的项目)之间的区别。

我在想使用.Except()是一个好主意,但我不明白如何使用这个..帮助!

使用Except正确的路要走。 如果你的types覆盖EqualsGetHashCode ,或者你只对引用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,例如intstringdecimal等,则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); } }