[英]Union two lists of object but remove duplicates based on different values
我有两个对象列表:
List1 = [ {id: 1, parentId: null}, {id:2, parentId: null} ]
List2 = [ {id: 3, parentId: 1} ]
我想返回这两个的联合列表,但不包含ID为parentId的List2中的List1。 我在上面的示例中的结果是:
UnionList = [ {id:3, parentId: 1}, {id:2, parentId: null} ]
还有一件事情:这两个列表最初是两个IQueryable。 我简单地做一个ToList()将它们作为列表。
如何使用列表(如果不需要ToList(),则可以使用Iqueryables)获得正确的结果?
提前致谢!
我想我得到了您想要的-您不想再次出现任何ID。 因此,如果在字段“父母”中使用了一些“父母”,您是否不希望结果中额外包含它?
在这种情况下,您可以执行以下操作:
var result = List1.Where(x => !List2.Any(l2 => l2.parentId == x.id)).Union(List2);//.ToList();
“位置”部分排除了所有在List2中用作父项的项目。 然后,通过Union(排除重复项)合并List2。 ToList()可能是可选的,具体取决于下一步要执行的操作。
编辑:将表格Concat更改为Union。
您可以尝试在迭代List1时从List2中找到第一个匹配的ParentId
,并根据是否找到它进行添加:
var UnionList = new List<Item>();
foreach (var item in List1)
{
var match = List2.FirstOrDefault(x => x.ParentId == item.Id);
resultList.Add(match ?? item);
}
或仅使用LINQ:
var UnionList = new List<Item>(List1.Select(item => List2.FirstOrDefault(x => x.ParentId == item.Id) ?? item));
您可以使用System.Linq
扩展方法Union
(以获取两个列表的并集)以及Where
和All
来从第一个列表中过滤出不想包含的项目:
var result = list2.Union(list1.Where(l1 => list2.All(l2 => l2.ParentId != l1.Id)));
但是请注意, Union
将使用该类的Equals
方法确定两个项目是否匹配(默认情况下是引用比较),因此您需要重写Equals
和GetHashCode
才能删除重复项(其中将定义一个重复项)由您决定,在这种情况下,我想应该在两个项目的Id
属性匹配的地方定义,但也许您也会包括ParentId
)。
例如:
public class Item
{
public int Id { get; set; }
public int? ParentId { get; set; }
public override int GetHashCode()
{
return Id.GetHashCode();
}
public override bool Equals(object obj)
{
return Id == (obj as Item)?.Id;
}
}
然后一个示例用法是:
public class Program
{
private static void Main(string[] args)
{
var list1 = new List<Item>
{
new Item {Id = 1, ParentId = null},
new Item {Id = 2, ParentId = null},
new Item {Id = 3, ParentId = 1}
};
var list2 = new List<Item>
{
new Item {Id = 3, ParentId = 1}
};
var result = list2.Union(list1.Where(l1 => list2.All(l2 => l2.ParentId != l1.Id)));
GetKeyFromUser("\nDone! Press any key to exit...");
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.