【问题标题】:Comparing two Lists and returning the distinct values and the differences比较两个列表并返回不同的值和差异
【发布时间】:2013-08-08 13:46:23
【问题描述】:

我有两个列表:

List A {A, B, C, D}

List B {A, E, F, G}

我需要生成三个列表:

仅包含列表 A 中的项目的一个

(B、C、D)

一个只包含列表 B 中的项目

(E, F, G)

一个包含两个项目

(A)

鉴于列表实际上是注册表项,可能会有大量列表,因此如果我选择使用传统的 ForEach 或 For(int i...) 方法,我可以预见到巨大的性能开销。

如果他们能有效地完成工作,我不反对这些,但我更喜欢使用 Linq。

有人有什么想法吗?

我不在乎相同的记录。

我已经创建了一个 IEquatable<> 类来比较元素,但它是如何使用它来创建我正在努力解决的所需输出。

提前致谢。

顺便说一下,我正在使用 .NET 4.5 的 VS2012

【问题讨论】:

  • 向我们展示所涉及的课程。

标签: linq list c#-4.0 duplicates


【解决方案1】:
var A = new List<string>() { "A", "B", "C", "D" };
var B = new List<string>() { "A", "E", "F", "G" };

A.Except(B).ToList()
// outputs List<string>(2) { "B", "C", "D" }
B.Except(A).ToList()
// outputs List<string>(2) { "E", "F", "G" }
B.Intersect(A).ToList()
// outputs List<string>(2) { "A" }

【讨论】:

  • 从技术上讲,OP 是错误的,B 仅在列表 A 中,E 仅在列表 B 中,所以这两个除了不同 :-)
  • 哎呀,B = A、B、F、G 的输出,我的代码中的 init 错误。改变了输出:) 抱歉
  • 对不起,伙计们,我应该在发布之前阅读我的示例(D'oh!)无论如何,谢谢这些看起来正是我所需要的!
  • 正确方法如下 .... //唯一来自两个列表 var A = new List() { 1,2,3,4 }; var B = new List() { 1, 5, 6, 7 }; var a= A.Except(B).ToList(); // 输出 List(2) { 2,3,4 } var b= B.Except(A).ToList(); // 输出 List(2) { 5,6,7 } var abint= B.Intersect(A).ToList(); // 输出 List(2) { 1 }
【解决方案2】:

使用 LINQ

listA.Except(listB) 

这将为您提供 listA 中所有不在 listB 中的项目。

对于类似

listA.SequenceEqual(listB)

【讨论】:

    猜你喜欢
    • 2014-02-26
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多