簡體   English   中英

有沒有更有效的方法來創建分組列表

[英]Is there a more efficient way to create a Grouped list

我想創建一個新的,已刪除的,常見項目的分組列表。 我目前以這種方式:

public class ListSortingGroupingTest
{
    List<int> OldList = new List<int> { 1, 2, 3, 4, 5 };
    List<int> NewList = new List<int> { 3, 4, 5, 7, 8, 9 };

    public void CreateGroupedList()
    {
        var deleted = OldList.Except(NewList).Select(i => new { Group = "Deleted", Number = i });
        var added = NewList.Except(OldList).Select(i => new { Group = "Added", Number = i});
        var common = NewList.Intersect(OldList).Select(i => new { Group = "Common", Number = i});

        var result = deleted.Union(added).Union(common);

    }
}

這可行。 但是我想知道是否有更好或更有效的方法?

最終,我希望在WPF分組ListView中綁定到此。

您當前的方法是提取信息以用於新舊值集(即唯一序列)之間的變化的標准自然方法。 由於基於哈希查找的實現,因此使用的LINQ集運算符( ExceptIntersect )非常有效。 盡管這3個調用將在內部創建3個哈希集,但復雜度仍為O(N+M) 唯一的改進是使用Concat而不是Union ,因為以前的方法將唯一地分隔值。

一種更有效的方法(但仍然是O(N+M) )是將舊項和新項與附加屬性連接,以指定值是舊值還是新值,然后按值分組並確定添加/刪除/通用狀態庫關於分組計數和內容-具有2個值的組是常見的,對於具有單個值的組,添加/刪除取決於該值是新值還是舊值:

var result = OldList.Select(x => new { Value = x, IsNew = false })
    .Concat(NewList.Select(x => new { Value = x, IsNew = true }))
    .GroupBy(x => x.Value)
    .Select(g => new
    {
        Group = g.Count() > 1 ? "Common" : g.First().IsNew ? "Added" : "Deleted",
        Number = g.Key
    });

嘗試這個。

var result = OldList.Union(NewList).Select(n => new
        {
            Group = OldList.Contains(n) && NewList.Contains(n) ? "Common" : (OldList.Contains(n)) ? "Deleted" : "Added",
            Number = n
        }).ToList();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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