【问题标题】:Efficiently gather a list of objects有效地收集对象列表
【发布时间】:2014-12-15 07:52:08
【问题描述】:
List<MyClass> options = new List<MyClass>();
foreach (MyClass entity in ExistingList) {
    if (entity.IsCoolEnough) {
        options.Add(entity);
    }
}

我只是好奇最快、最有效的方法是什么。该列表不是很大,但它经常运行,所以我想保持它的活泼。我也不在寻找冗长的变化。我只是希望运行时尽可能快。

【问题讨论】:

  • “不是很大”有多大,“经常”有多频繁?如果它是一个非常小的列表,每秒运行一次,如果你尝试优化它也没关系。另一方面,如果是每隔几英里,几千件,那就是另一回事了。
  • 假设ExistingList 经常变化,可能值得考虑在ExistingList 的构建过程中已经基于IsCoolEnough 进行选择。因此,根本不需要这个额外的选择例程。最有效的代码是永远不会运行的代码;-)

标签: c# list


【解决方案1】:

嗯,使用 LINQ 可以更直观地阅读:

var options = (from e in ExistingList where e.IsCoolEnough select e).ToList();

不过,我不确定它是否更快或更高效。

我想说,对于小列表,这实际上是某种过度优化,对于短列表,foreachfor 和上述方法根本不应该有任何区别。因此,与其对此进行优化,不如先检查它是否存在运行时问题。

【讨论】:

  • 这是一个很好的例子——建议也很可靠。我试图先发制人并避免开始减速,但最好等着看它是否真的是一个问题。谢谢!
【解决方案2】:

我看到了两种可能的“一般”优化案例,在数据库级别或模型级别,具体取决于资源占用的位置。

如果您可以通过 db-level 中 IsCoolEnough 上的 where 进行选择:

var result = ExistingList.Where(e => e.IsCoolEnough) // still in db?
                         .ToList(); // enumerate

如果你不能并且昂贵的操作是IsCoolEnough

var result = new ConcurrentBag<MyClass>(); // Thread safe but unordered.
Parallel.ForEach(ExistingList, current =>
             {
               if (current.IsCoolEnough) result.Add(current);
             });

鉴于完全未知的要求,我不可能给出更可靠的建议。但是您的实施中没有任何普遍的“错误”。

I like referring to this article, so I'm doing that again now. It's worth the read (Ie click somewhere on/in this line/sentence, it's a link).

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-30
    • 1970-01-01
    • 2012-04-23
    • 1970-01-01
    • 1970-01-01
    • 2020-09-15
    • 1970-01-01
    相关资源
    最近更新 更多