C# - 如何获得两个没有标识符的列表的补充

标签 c# linq list

我有两个相同类型的列表。该类型没有标识符或任何其他有保证的方式来以编程方式区分。

  • 列表 A:{1、2、2、3、5、8、8、8}
  • 列表 B:{1、3、5、8}

我想要 A 中不在 B 中的项目。

  • 期望的结果:{2, 2, 8, 8}

如果类型有标识符,我可以使用如下语句...

var result = listA
      .Where(a => listB.Where(b => b.Id == a.Id).Count() == 0)
      .ToList();

到目前为止,我能做到这一点的唯一方法是使用一个循环,在该循环中我将每个项目添加到原始列表中未出现的次数。

foreach (var val in listB.Select(b => b.val).Distinct())
{
  var countA = listA.Where(a => a.val == val).Count();
  var countB = listB.Where(b => b.val == val).Count();
  var item = listA.Where(a => a.val == val).FirstOrDefault();

  for (int i=0; i<countA-countB; i++)
    result.Add(item);
}

有没有更简洁的方法来实现这一目标?

编辑: 这是列表中对象的简化版本。它来自正在访问另一个系统的 Web 服务。

public class myObject
{
  public DateTime SomeDate { get; set; }
  public decimal SomeNumber; { get; set; }
  public bool IsSomething { get; set; }
  public string SomeString { get; set; }
}

我收到的数据具有相同的 SomeDate/SomeString 值以及 SomeNumber 和 IsSomething 的重复值。两个对象可能具有相同的属性,但我需要将它们视为不同的对象。

最佳答案

试试这个:

var listA = new List<Int32> {1, 2, 2, 3, 5, 8, 8, 8};
var listB = new List<Int32> {1, 3, 5, 8};
var listResult = new List<Int32>(listA);

foreach(var itemB in listB)
{
    listResult.Remove(itemB);
}

关于C# - 如何获得两个没有标识符的列表的补充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5122475/

相关文章:

c# - https 使用带有 kestrel useHttps 的手动 ssl 证书

c# - SEO - 为爬虫重定向 301 的正确方法

c# - 如何在我的 C# 浏览器中单击非 ID java 按钮?

LINQ to Objects 问题

c# - 这两个 LINQ 查询有什么区别?

c# - 防止 Entity Framework 在使用 Include 时添加 ORDER BY

Python 列表推导式、子列表行和列

Scala:将元素附加到列表

c# - foreach 和集合的使用速度慢吗?

list - Python:在另一个列表的成员中查找一个列表(按顺序)