【发布时间】:2008-11-23 02:20:38
【问题描述】:
我有一个具有属性 ID 的类代理
给定一组代理,我需要检查其中是否有重复的 ID。
我目前正在使用哈希表执行此操作,但我正在尝试获取 Linq-ified,这样做的好方法是什么?
【问题讨论】:
我有一个具有属性 ID 的类代理
给定一组代理,我需要检查其中是否有重复的 ID。
我目前正在使用哈希表执行此操作,但我正在尝试获取 Linq-ified,这样做的好方法是什么?
【问题讨论】:
类似于 Y Low 的方法,
已编辑:
var duplicates = agents.GroupBy(a => a.ID).Where(a=>a.Count() > 1);
foreach (var agent in duplicates)
{
Console.WriteLine(agent.Key.ToString());
}
【讨论】:
对于它的价值,我只是比较了我们在这个线程中遇到的两种方法。首先我定义了一个辅助类:
public class Foo
{
public int ID;
}
...然后用随机 ID 制作了一个大的实例列表:
var list = new List<Foo>();
var r = new Random();
for (int i = 0; i < 10000; i++) list.Add(new Foo { ID = r.Next() });
...最后,给代码计时:
var sw = new Stopwatch();
sw.Start();
bool b = list.Any(i => list.Where(j => i != j).Any(j => j.ID == i.ID));
Console.WriteLine(b);
Console.WriteLine(sw.ElapsedTicks);
sw.Reset();
sw.Start();
b = (list.GroupBy(i => i.ID).Count() != list.Count);
Console.WriteLine(b);
Console.WriteLine(sw.ElapsedTicks);
这是一个输出:
错误
59392129
错误
168151
所以我认为可以肯定地说,分组然后将组数与项目数进行比较比进行暴力“嵌套 Any”比较快方式。 p>
【讨论】:
我的看法(不算数!):
var duplicates = agents
.GroupBy(a => a.ID)
.Where(g => g.Skip(1).Any());
【讨论】:
foreach(var agent in Agents) {
if(Agents.Count(a => a.ID == agent.ID) > 1)
Console.WriteLine("Found: {0}", agent.ID);
}
【讨论】:
bool b = list.Any(i => list.Any(j => j.ID == i.ID && j != i));
这是一种蛮力的方法,但它确实有效。使用 except() 扩展方法可能有更聪明的方法。
编辑:你实际上并没有说你需要知道哪些项是“重复的”,只是你需要知道是否在哪里。除了给你一个可以迭代的列表之外,这将做同样的事情:
list.Where(i => list.Any(j => j.ID == i.ID && j != i))
我也喜欢分组方法(按 ID 分组并找到计数 > 1 的组)。
【讨论】:
这就是我不需要在一行中进行分组的方式:
List<Agent> duplicates = new HashSet<Agent>(agents.Where(c => agents.Count(x => x.ID == c.ID) > 1)).ToList();
【讨论】: