【问题标题】:Select Distinct from a list of IEnumerable<T> in .NET 2.0从 .NET 2.0 中的 IEnumerable<T> 列表中选择 Distinct
【发布时间】:2010-09-25 13:30:55
【问题描述】:

我正在尝试过滤重复值的 IEnumerable 对象,因此我想从中获取不同的值,例如,假设它保存天数:

星期一 周二 周三 星期三

我想过滤它并返回:

星期一 周二 星期三

.net 2.0 中最有效的方法是什么?

【问题讨论】:

  • 你能用 3.5 的编译器编译吗?
  • 不开玩笑,JaredPar,这是一个带有 LINQ 的单行代码。
  • JaredPar 提出了一个很好的观点,即使针对 .NET 2.0,您也可以在 C# 3.0 编译器(VS2008、.NET 3.5)中使用大量 LINQ-y 语法

标签: vb.net ienumerable


【解决方案1】:
Dictionary<object, object> list = new Dictionary<object, object>();
foreach (object o in enumerable)
    if (!list.ContainsKey(o))
    {
        // Do the actual work.
        list[o] = null;
    }

字典将使用哈希表来保存键,因此查找是有效的。

排序最多为 O(n log(n))。具有高效散列函数的散列表通常优于它(O(1) 查找)。

【讨论】:

  • 是的,如果您对数据没有任何其他事情要做,它就可以工作,这不太可能。如果您的意思是再次遍历 o.Keys 集合,这不是一个好主意,因为它不会保留原始集合中项目的顺序,而且肯定会更慢。
【解决方案2】:

另一种选择是使用 HashSet - HashSet 不允许使用重复项,并且不需要键/值对。

【讨论】:

  • 哇,那是我的错误——我没有意识到 HashSet 是 System.Core 的一部分。我的错!
【解决方案3】:

创建另一个 IEnumerable。对原件进行排序。对于原件中的每一项,如果新的不包含旧的,则添加它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-01
    • 1970-01-01
    • 2011-11-25
    相关资源
    最近更新 更多