【问题标题】:List<Of T> Distinct in .NET 3.0?.NET 3.0 中的 List<Of T> 不同?
【发布时间】:2011-02-09 14:02:50
【问题描述】:

NET 3.0。

List(Of T) 上是否有 Distinct? 我需要导入哪些包?

如果不是,是否有等价物?

【问题讨论】:

  • Linq 直到 .NET 3.5 才可用。也许是时候升级了。

标签: .net vb.net list .net-3.0


【解决方案1】:

在 .NET 3.0 中,一种选择是使用带有虚拟值的 Dictionary&lt;,&gt;。例如。 (不处理nulls):

List<Foo> foos  = ...
Dictionary<Foo, bool> dict = new Dictionary<Foo, bool>();

foreach(Foo foo in foos)
   dict[foo] = true;

ICollection<Foo> distinctFoos = dict.Keys;

如果您不喜欢这种“hack”,则必须推出自己的 set 类。

编辑:这是在源代码中处理nulls 的版本:

public static IEnumerable<T> Distinct<T>(IEnumerable<T> source)
{
    if (source == null)
        throw new ArgumentNullException("source");

    Dictionary<T, bool> dict = new Dictionary<T, bool>();
    bool nullSeen = false;

    foreach (T item in source)
    {
        if (item == null)
        {
            if (!nullSeen)
                yield return item;

            nullSeen = true;
        }

        else if (!dict.ContainsKey(item))
        {
            dict.Add(item, true);
            yield return item;
        }
    }
}

【讨论】:

  • 这不能正确处理List&lt;T&gt; 中的null 实例。
  • @Jason:感谢您的评论。我的修改是否让它变得更好?
  • 您将其作为 ICollection。你能把它维护成 List 吗?
  • @waqasahmed:不,因为该类型没有实现IList&lt;T&gt;,但您始终可以使用这些项目创建一个新列表,例如new List&lt;Foo&gt;(distinctFoos)
【解决方案2】:

不,您必须自行开发,或者将您的项目更改为 .NET 3.5 或 4.0。

【讨论】:

    【解决方案3】:

    在 .NET 3 中,您必须自己动手。如果您查看Remove duplicates from a List<T> in C#,则有一个来自 Keith 的 Distinct for .NET 2 实现,它使用 HashSet。

    这是 System.Core 程序集的一部分,因此您需要在项目中引用它,这意味着安装 .NET 3.5 框架,但由于 .NET 3.5 在相同版本的 CLR 上运行,您赢了这样做不会有任何问题。部署时,您需要确保在客户端计算机上安装了 .NET 3.5 框架,或者在发布目录中包含 System.Core.dll。

    【讨论】:

      【解决方案4】:

      LinqBridge 将允许您以 .Net 3.0 为目标,但仍使用 Linq。这包括IEnumerable(Of T) 上的Distinct 扩展方法。

      【讨论】:

      • 我不使用第三方的东西,使用时必须包含免责声明。
      猜你喜欢
      • 2011-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-28
      • 2012-03-27
      • 1970-01-01
      • 2010-09-19
      • 2021-05-25
      相关资源
      最近更新 更多