[英]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集運算符( Except
和Intersect
)非常有效。 盡管這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.