C#比较两个列表,返回列表2中的新项目

时间:2011-05-02 12:33:08

标签: c# list compare

这可能是一个常见的问题,我在没有找到有效的解决方案的情况下搜索了其他问题(请注意,我在C#和linq方面的技能有限 - 所以一个简单的解决方案将不胜感激!)。

以下是问题

我有两个包含对象的列表。我想比较它们并返回list2中的所有NEW对象。

示例:

ObjectList List1; //包含存储在数据库中的3个对象

ObjectList List2; //包含与List1中相同的3个对象以及从网页添加的新对象(父对象已在网页上更新)

ObjectList List3; //应该对List1和List2进行比较,并返回List2中的NEW对象(因此结果应该只是对象编号4)

注意:

  • 顺序无关紧要。我只想要新对象
  • 通常,对象仅添加到List2。如果删除了任何对象(与List1相比),则应忽略此对象。 (所以只存在于List1中的对象不感兴趣)

感谢您在我的搜索中错过的任何建议或以前问题的链接

修改

以下是使用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)));

4 个答案:

答案 0 :(得分:14)

使用此:

var list3 = list2.Except(list1);

这使用Except扩展方法,该方法返回list2中不在list1内的所有元素。
值得注意的是,Except会返回IEnumerable<T>,其中Tlist1list2内对象的类型。
如果您需要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
)

http://msdn.microsoft.com/en-us/library/bb336390.aspx