我有一个可能包含重复项的无序枚举,我想删除所有具有重复项的项目,并仅保留在原始枚举中只出现一次的项目。
例如:由于它们出现了多次,因此将删除A和C:
输入 {A,C,B,A,C,D,A}
输出 {B,D}
一个快速而简单的实现可能是:
IEnumerable<T> Filter(IEnumerable<T> items)
{
items.Where(item => items.Count(x => x.Equals(item)) == 1);
}
显然,这不是一个快速或优雅的方法。
下面的示例仍然是二次的(稍微快一些),但需要对输入进行ToList()调用。
IEnumerable<T> Filter(IEnumerable<T> items)
{
List<T> src = items.ToList();
for(int i=0; i<src.Count; i++)
{
if (src.IndexOf(src[i], i+1) < 0)
yield return src[i];
}
}
如果您希望代码在保持紧凑和易读的同时,不会像这些实现一样非常慢,那么您该如何做呢?
.ToList()
运行稍微慢一些,但是在 580k 条目下仍然很快。 - Brad Christie