【发布时间】:2011-02-09 14:02:50
【问题描述】:
NET 3.0。
List(Of T) 上是否有 Distinct?
我需要导入哪些包?
如果不是,是否有等价物?
【问题讨论】:
-
Linq 直到 .NET 3.5 才可用。也许是时候升级了。
NET 3.0。
List(Of T) 上是否有 Distinct?
我需要导入哪些包?
如果不是,是否有等价物?
【问题讨论】:
在 .NET 3.0 中,一种选择是使用带有虚拟值的 Dictionary<,>。例如。 (不处理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<T> 中的null 实例。
IList<T>,但您始终可以使用这些项目创建一个新列表,例如new List<Foo>(distinctFoos)
不,您必须自行开发,或者将您的项目更改为 .NET 3.5 或 4.0。
【讨论】:
在 .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。
【讨论】:
LinqBridge 将允许您以 .Net 3.0 为目标,但仍使用 Linq。这包括IEnumerable(Of T) 上的Distinct 扩展方法。
【讨论】: