【问题标题】:Checking for the existence of an object in a collection (of T)检查(T的)集合中是否存在对象
【发布时间】:2008-12-29 22:16:33
【问题描述】:
【问题讨论】:
标签:
.net
linq
collections
【解决方案1】:
但是,这是最快的合理流程吗?
我猜想一种快速的方法(也许是最快的方法)可能是将所有对象添加到 Dictionary 或 HashSet 中,使用属性作为关键字段:像 HashSet.Add 这样的方法有返回代码告诉您是否已添加此属性值。例如:
static bool containsDuplicate(Container<Foo> fooCollection)
{
//create the hash set
HashSet<Bar> hashSet = new HashSet<Bar>();
//for each object to be tested
foreach (Foo foo in fooCollection)
{
//get the interesting object property
Bar propertyValue = fooCollection.bar;
//see whather we've already seen this property value
if (!hashSet.Add(propertyValue))
{
//duplicate detected
return true;
}
}
//no duplicate detected
return false;
}
【解决方案2】:
LINQ 几乎从来都不是做任何事情的最快方式(就原始执行时间而言)。
不过,它通常“足够快”。当您有一个带有单元测试的工作应用程序时,您可以对其进行分析以查看是否需要优化。
“我们应该忘记小的效率,比如说大约 97% 的时间:过早的优化是万恶之源。” -唐纳德·高德纳
【解决方案3】:
确实,LINQ 可以正常工作。当然,如果您知道可以优化给定情况下的情况,则始终可以为更具体的类型编写自己的 LINQ 扩展方法。由于类型 更具体,因此应优先使用您自己的方法,而不是默认的 Enumerable 方法。哪个很好;-p
【解决方案4】:
这实际上取决于您的集合中的数据量以及执行此操作的频率。 Linq 按属性搜索将必须通读集合中的每个项目/属性。
如果您的集合中只有 10 个项目,并且此操作每秒只执行一次,那么仅向前扫描以通过属性查找项目很可能足够快。
如果您的集合中有 1000 万个项目,那么只需要转发或需要每秒执行 100 次此类操作,那么您可能需要对该属性进行一些索引。
如果事实证明您需要对此进行索引,我建议将此逻辑封装在一个对象中。因此,例如添加一个 Item 会将其添加到主集合中,并在排序的哈希集中添加一个属性索引器。