检查集合中是否存在对象(T)

时间:2008-12-29 22:16:34

标签: .net linq collections

我在这个问题LINQy way to check if any objects in a collection have the same property value上看到了这个问题,请求说明如何使用LINQ来查看属性是否与集合匹配。但是,这是最快的合理过程吗?我将部署需要一定量资源管理的东西,并且我希望应用程序能够尽可能地响应,而不会使代码非常难以在其他人或我自己以后再回到它时进行解密。

4 个答案:

答案 0 :(得分:2)

  

然而,这是否是执行此操作的最快合理流程?

我猜这样做的一种快速方式(也许是最快的方法)可能是将所有对象添加到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;
}

答案 1 :(得分:1)

LINQ几乎绝不是最快的方式(就原始执行时间而言)。

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

“我们应该忘记小的效率,大约97%的时间说:过早的优化是所有邪恶的根源。” -Donald Knuth

答案 2 :(得分:0)

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

答案 3 :(得分:0)

这实际上取决于集合中的数据量以及执行此操作的频率。 Linq搜索属性必须读取集合中的每个项目/属性。

如果您的收藏中只有10个项目并且此操作仅每秒执行一次,那么仅向前扫描以查找属性的项目很可能足够快。

如果你的收藏品中有1000万件物品,那么只需要前进或者需要100次执行此类操作,那么你可能需要一些关于此属性的索引。

如果结果你需要索引这个我建议将这个逻辑封装在一个对象中。因此,例如添加一个Item会将它添加到主集合中,并在一个散列集中添加一个属性索引器。