2011-06-17 21 views
1

我有2名不同的列表:SQL查询 - 根据差异生成2个集合?

public class Foo 
{ 
    public Int32 Id { get; set; } 
} 

ICollection<Foo> OriginalCollection 
ICollection<Foo> NewCollection 

我要产生2列出了能够为他们的foreach ...

  • 是OriginalCollection包含NewCollection不所有项目(基本上,一个集合被删除的东西)。
  • 是OriginalCollection不包含NewCollection所有项目不会(基本上,加入的东西的集合)。

我知道我会用LINQ取回一个IEnumerable,这很好,因为我需要进行foreach。我只是不知道我的查询应该是什么样子......


更新:

我忘了提,我没有尝试except子句...它失败,因为对象不是一样。它们只包含相同的ID。

+0

[101个LINQ样品(http://msdn.microsoft.com/en-us/vcsharp/aa336746) – Oded

回答

1

所以,你要设置的互补。 这篇文章似乎满足您的需求:

Quickest way to find the complement of two collections in C#

或者也许Enumerable.Except方法:

http://msdn.microsoft.com/en-us/library/system.linq.enumerable.except.aspx

+0

我更新了我的问题,二/三我忘了提,我做尝试“Except”,但由于对象不相同而失败,它们只包含相同的Id。 – michael

+0

你看看我的第一个链接吗?它描述了如何指定您自己的自定义EualityComparer,以便Except能够按您需要的方式工作。 – mtazva

+0

所以...链接#1是我的问题的重复。真棒。 – michael

0
using System.Linq; 

originalC.Except(newC, comparer); 
newC.Except(originalC, comparer); 

以下编辑:

可以使用过载需要一个“IEqualityComparer比较器”。

您可以定义实现与任何类型的比较逻辑,你希望界面小班。

+0

我更新了我的问题,二/三我忘了提,我也尝试了'Except'但它失败,因为对象是不一样的,他们只包含了相同的ID。 – michael

0
List<Foo> original = ... 
List<Foo> modified = ... 
... 
var deleted = original.Except(modified); 
var added = modified.Except(original); 

你可以明确地使用LINQ但它并不值得。一种方法可以是:

var deleted = from i in original 
       where !modified.Contains(i) 
       select i; 

var added = from i in modified 
      where !original.Contains(i) 
      select i; 
+0

我更新了我的问题b/c我忘记提及我尝试过'Except',但由于对象不一样而失败,它们只包含相同的Id。 – michael