SQL查询 - 根据差异生成2个集合?
我有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。
所以,你要设置的互补。 这篇文章似乎满足您的需求:
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
using System.Linq;
originalC.Except(newC, comparer);
newC.Except(originalC, comparer);
以下编辑:
可以使用过载需要一个“IEqualityComparer比较器”。
您可以定义实现与任何类型的比较逻辑,你希望界面小班。
我更新了我的问题,二/三我忘了提,我也尝试了'Except'但它失败,因为对象是不一样的,他们只包含了相同的ID。 – michael
您正在寻找除运营商
http://msdn.microsoft.com/en-us/vcsharp/aa336761.aspx#except1
NewCollection -except> OriginalCollection =删除
OriginalCollection -except> NewCollection =加入
我更新了我的问题b/c我忘记提及我尝试过'Except',但由于对象不相同而失败,它们只包含相同的Id。 – michael
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;
我更新了我的问题b/c我忘记提及我尝试过'Except',但由于对象不一样而失败,它们只包含相同的Id。 – michael
[101个LINQ样品(http://msdn.microsoft.com/en-us/vcsharp/aa336746) – Oded