【问题标题】:Is there a more efficient way to create a Grouped list有没有更有效的方法来创建分组列表
【发布时间】:2017-06-21 16:33:13
【问题描述】:

我想创建一个包含 NEW、DELETED、COMMON 项目的分组列表。我目前是这样做的:

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 listview grouping


    【解决方案1】:

    您当前的方法是提取新旧值集(即唯一序列)之间变化信息的标准且自然的方法。由于基于哈希查找的实现,使用的 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
        });
    

    【讨论】:

    • 很棒的答案,而且效率更高。我对我和你的实现运行了秒表,结果如下:ME => 执行时间:16954(6 毫秒)你 => 执行时间:1321(0 毫秒)
    【解决方案2】:

    试试这个。

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

    【讨论】:

      猜你喜欢
      • 2010-09-25
      • 1970-01-01
      • 2010-09-09
      • 1970-01-01
      • 2018-05-28
      • 2016-06-19
      • 2019-09-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多