我想创建一个新的、已删除的、常见的项目的分组列表。我目前这样做:
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 Grouped 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
});
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句