这可能是一个常见的问题,我在没有找到有效的解决方案的情况下搜索了其他问题(请注意,我在C#和linq方面的技能有限 - 所以一个简单的解决方案将不胜感激!)。
以下是问题:
我有两个包含对象的列表。我想比较它们并返回list2中的所有NEW对象。
示例:
ObjectList List1; //包含存储在数据库中的3个对象
ObjectList List2; //包含与List1中相同的3个对象以及从网页添加的新对象(父对象已在网页上更新)
ObjectList List3; //应该对List1和List2进行比较,并返回List2中的NEW对象(因此结果应该只是对象编号4)
注意:
感谢您在我的搜索中错过的任何建议或以前问题的链接
修改
以下是使用Except进行首次尝试的一个小示例(这会返回错误)
我已经缩短了一点。该方法来自我们的软件,因此很可能不为您所知。对不起。
// caDialogObjects = List1 (caDialogQLMLinks is the link to the objects)
RepositoryObjectList caDialogObjects = args.Object.GetConfiguration().GetObjectSet(caDialogQLMLinks);
// caObjectObjects = List2 (caObjectQLMLinks is the link to the objects)
RepositoryObjectList caObjectObjects = args.Object.GetConfiguration().GetObjectSet(caObjectQLMLinks);
// List 3
RepositoryObjectList caTotal;
caTotal = caObjectObjects.Except(caDialogObjects);
有效的解决方案 由于列表只是一个引用(而不是值),因此Exception不起作用。可以使用第二个参数,但我得到了一个有效的linq代码:
RepositoryObjectList caNewCA =
new RepositoryObjectList(caDialogObjects.Where(item1 =>
!caObjectObjects.Any(item2 => item1.Id == item2.Id)));
答案 0 :(得分:14)
使用此:
var list3 = list2.Except(list1);
这使用Except
扩展方法,该方法返回list2
中不在list1
内的所有元素。
值得注意的是,Except
会返回IEnumerable<T>
,其中T
是list1
和list2
内对象的类型。
如果您需要list3
属于特定类型,则需要转换该返回值。在最简单的情况下,您的目标类型具有可以处理的构造函数IEnumerable<T>
:
RepositoryObjectList list3 = new RepositoryObjectList(list2.Except(list1));
答案 1 :(得分:4)
List<MyObject> objectList1 = new List<MyObject>();
List<MyObject> objectList2 = new List<MyObject>();
List<MyObject> objectList3 = objectList2.Where(o => !objectList1.Contains(o)).ToList();
只要MyObject为IComparable
http://msdn.microsoft.com/en-us/library/system.icomparable.aspx
答案 2 :(得分:2)
这是一个如何使用LINQ来实现它的例子:
List<int> l1 = new List<int>();
List<int> l2 = new List<int>();
l1.AddRange(new int[] {1, 2, 3, 5});
l2.AddRange(new int[] {1, 2, 3, 4});
// get only the objects that are in l2, but not l1
var l3 = l2.Except(l1);
第三个列表只包含一个元素,4。
答案 3 :(得分:1)
secondList.Except(firstList)
使用
public static IEnumerable<TSource> Except<TSource>(
this IEnumerable<TSource> first,
IEnumerable<TSource> second
)
http://msdn.microsoft.com/en-us/library/bb300779.aspx
或
secondList.Except(firstList,new CustomComparer())
使用
public static IEnumerable<TSource> Except<TSource>(
this IEnumerable<TSource> first,
IEnumerable<TSource> second,
IEqualityComparer<TSource> comparer
)