我有两个相同类型的列表。该类型没有标识符或任何其他有保证的方式来以编程方式区分。
- 列表 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/