【问题标题】:SQL Query -- Generate a 2 collections based on differences?SQL 查询——根据差异生成 2 个集合?
【发布时间】:2011-09-17 10:48:34
【问题描述】:

我有 2 个不同的列表:

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

ICollection<Foo> OriginalCollection
ICollection<Foo> NewCollection

我想生成 2 个列表以便能够对它们进行搜索...

  • OriginalCollection 包含但 NewCollection 不包含的所有项目(基本上是已删除的内容的集合)。
  • OriginalCollection 不包含 NewCollection 包含的所有项目(基本上是添加的东西的集合)。

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


更新:

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

【问题讨论】:

标签: c# linq collections


【解决方案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

【讨论】:

  • 我更新了我的问题 b/c 我忘了提到我确实尝试了 Except 但它失败了,因为对象不一样,它们只包含相同的 ID。
  • 您查看我的第一个链接了吗?它描述了如何指定您自己的自定义 EualityComparer,以便 except 以您需要的方式工作。
  • so... 链接 #1 与我的问题重复。太棒了。
【解决方案2】:
using System.Linq;

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

以下编辑:

您可以使用带有“IEqualityComparer 比较器”的重载。

您可以定义一个小类,使用您希望的任何类型的比较逻辑来实现该接口。

【讨论】:

  • 我更新了我的问题 b/c 我忘了提到我确实尝试了 Except 但它失败了,因为对象不一样,它们只包含相同的 ID。
【解决方案3】:

您正在寻找例外运算符

http://msdn.microsoft.com/en-us/vcsharp/aa336761.aspx#except1

NewCollection -except> OriginalCollection = 已删除

OriginalCollection -except> NewCollection = 添加

【讨论】:

  • 我更新了我的问题 b/c 我忘了提到我确实尝试了 Except 但它失败了,因为对象不一样,它们只包含相同的 ID。
【解决方案4】:
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。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-26
  • 1970-01-01
  • 2022-12-19
  • 2011-07-18
  • 1970-01-01
  • 2020-02-18
相关资源
最近更新 更多