簡體   English   中英

合並兩個對象列表,但根據不同的值刪除重復項

[英]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 (以獲取兩個列表的並集)以及WhereAll來從第一個列表中過濾出不想包含的項目:

var result = list2.Union(list1.Where(l1 => list2.All(l2 => l2.ParentId != l1.Id)));

但是請注意, Union將使用該類的Equals方法確定兩個項目是否匹配(默認情況下是引用比較),因此您需要重寫EqualsGetHashCode才能刪除重復項(其中將定義一個重復項)由您決定,在這種情況下,我想應該在兩個項目的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM