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

May*_*ayo 2 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();
Run Code Online (Sandbox Code Playgroud)

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

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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

public class myObject
{
  public DateTime SomeDate { get; set; }
  public decimal SomeNumber; { get; set; }
  public bool IsSomething { get; set; }
  public string SomeString { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

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

Kri*_*nov 9

试试这个:

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);
}
Run Code Online (Sandbox Code Playgroud)