【问题标题】:Checking for the existence of an object in a collection (of T)检查(T的)集合中是否存在对象
【发布时间】:2008-12-29 22:16:33
【问题描述】:

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

【问题讨论】:

    标签: .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 会将其添加到主集合中,并在排序的哈希集中添加一个属性索引器。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-03-24
            • 1970-01-01
            • 2011-01-24
            • 1970-01-01
            • 2018-08-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多