C# 比较两个相同对象类型的列表

标签 c# linq list

我正在尝试使用该类型的多个属性来比较两个相同类型的列表。

例如,

我有一个名为 Details 的类

public class Details
{
    public   int id;
    public string symbol;
    public string code;
}

我有以下两个列表:

List<Details> list1 = new List<Details>();  
List<Details> list2 = new List<Details>();

list1.Add(new Details() { id=1,symbol="ANSI",code="NITE"});
list1.Add(new Details() { id = 1, symbol = "ANSI", code = "CALGO" });
list1.Add(new Details() { id = 1, symbol = "ANSI", code = "CANT" });
list1.Add(new Details() { id=2,symbol="ANSI",code="NITE"});
list1.Add(new Details() { id = 2, symbol = "ANSI", code = "CALGO" });
list1.Add(new Details() { id = 2, symbol = "ANSI", code = "CANT" });

list2.Add(new Details() { id = 1, symbol = "ANSI", code = "NITE" });
list2.Add(new Details() { id = 1, symbol = "ANSI", code = "CALGO" });
list2.Add(new Details() { id = 2, symbol = "ANSI", code = "NITE" });

我只想要 List1 中具有相同 ID、符号但代码不同的数据。

因此,在上述情况下,结果将如下所示。

list1.Add(new Details() { id = 1, symbol = "ANSI", code = "CANT" });
list1.Add(new Details() { id = 2, symbol = "ANSI", code = "CALGO" });
list1.Add(new Details() { id = 2, symbol = "ANSI", code = "CANT" });

如果这可以通过 Linq 而不是使用 foreach 来实现,那就太好了。

我在下面尝试过,但那是不正确的。

var temp =list1.Where(x=>list2.Any(z=>x.id==z.id && string.Equals(x.symbol,z.symbol) && !string.Equals(x.code,z.code)));

最佳答案

看起来您需要行来满足两个条件,而不是一个,以便输出:

  • idsymbol 需要匹配,并且
  • idsymbolcode 不能匹配。

以下是直接使用 LINQ 执行此操作的方法:

var tmp = list1.Where(x=>
    list2.Any(z=>x.id==z.id && x.symbol==z.symbol)
&& !list2.Any(z => x.id==z.id && x.symbol==z.symbol && x.code==z.code));

Demo.

基于应用 De Morgan's laws 的替代方案:

var tmp = list1.Where(x=>
    list2.Any(z=>x.id==z.id && x.symbol==z.symbol)
 && list2.All(z => x.id!=z.id || x.symbol!=z.symbol || x.code!=z.code));

Demo.

关于C# 比较两个相同对象类型的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40770020/

相关文章:

C# 如果找不到元素,则执行其他操作

c# - 将 GUID 转换为字符串 Entity Framework

c# - ListView 项目在 winform 中选择

c# - 在 Asp.net Core 中使用 Ajax 验证表单

c# - 可以动态执行图像操作的图像 API/应用程序?

r - 将一列变量和一列值分成 r 中的各个组成部分

php - 列出一个目录中的所有文件 PHP

c# - 企业图书馆强命名指导包

c# - 在 Dynamic Linq 中使用 Any() 和 Count()

c - 我的数据结构错误 [STACK]