English 中文(简体)
检查集合中(T类型的)对象的存在
原标题:
  • 时间:2008-12-29 22:16:33
  •  标签:

我发现在这个问题上 LINQy way to check if any objects in a collection have the same property value 上有一个请求,要求使用LINQ来检查集合中的属性是否匹配。然而,这是否是最快的合理方法来做此事?我将部署一些需要一定数量的资源管理的东西,我希望应用程序能够尽可能地响应,而不会使代码在其他人或我自己稍后回来时变得极难理解。

最佳回答

然而,这是最快速合理的过程吗?

我猜快速的方法(也许是最快的方法)是将所有对象添加到字典或哈希集中,使用该属性作为键字段:像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;
}
问题回答

LINQ 幾乎從不是以原始執行時間為標準的最快方式。

通常情况下,“足够快”。当您有一个带有单元测试的工作应用时,可以对其进行剖析以查看是否需要优化。

我们应该忘记小的效率,大约 97% 的时间:过早优化是万恶之源。 -唐纳德·库特

实际上,LINQ 可以很好地工作。当然,如果您知道在特定情况下可以优化情况,您可以始终为更具体的类型编写自己的 LINQ 扩展方法。由于该类型更具体,应优先使用您自己的方法而不是默认的 Enumerable。这很好;-p

这取决于您的集合中的数据量和执行此操作的频率。按属性进行Linq搜索将不得不阅读集合中的每个项目/属性。

如果你的收藏只有10个物品,并且这个操作每秒只执行一次,那么按属性进行的仅向前扫描很可能足够快速。

如果您的收藏品有1000萬件物品,那麼如果需要每秒進行100次操作,那麼您可能需要對此屬性進行一些索引。

如果您需要索引此内容,我建议将此逻辑封装在一个对象中。例如,添加一个项目将其添加到主要集合中,并在某种哈希集合中添加一个属性索引器。





相关问题
热门标签