【问题标题】:Quickly retrieve the subset of properties used in a huge collection in C#在 C# 中快速检索大量集合中使用的属性子集
【发布时间】:2010-04-29 14:34:08
【问题描述】:

我有一个庞大的对象集合(我可以使用 OfType() 将其转换为可枚举)。这些对象中的每一个都有一个Category 属性,该属性是从应用程序中其他位置的列表中提取的。此集合可以达到数百个项目的大小,但可能只有 6/30 的可能类别被实际使用。找到这 6 个类别的最快方法是什么?巨大的 Collection 的大小使我无法只遍历整个事物并返回所有唯一值,那么是否有更快的方法来完成此操作?

理想情况下,我会将类别收集到List<string>

【问题讨论】:

  • 几百?我会将具有“数百个”项目的内存集合分类为 tiny,而不是 huge。我会将一个包含几十万个项目的内存集合分类为 huge
  • 我猜从内存对象本身的代码角度来看,1600 多个项目可能看起来并不那么大。但我可能有点害怕,因为这些文件每个都指 1-4MB 的文件,所以从那个角度看它看起来很大。但要引用类别,我不需要检索文件。

标签: c# collections performance subset


【解决方案1】:

如果您使用的是 .NET 3.5,请尝试以下操作:

List<string> categories = collection
    .Cast<Foo>()
    .Select(foo => foo.Category)
    .Distinct()
    .ToList();

应该很快。

我假设这些对象最初来自数据库?如果是这样,那么您可能想要求数据库为您完成工作。如果该列上有索引,那么您几乎可以立即获得结果,甚至无需将对象提取到内存中。

【讨论】:

  • 文件集合和类别列表都存储在数据库中,是的。但是,文件的 Category 列没有被索引,我现在还不能更改它。这个 LINQ 看起来应该可以解决问题,很有可能。
【解决方案2】:

庞大的 Collection 的大小让我无法只遍历整个事物并返回所有唯一值

恐怕为了找到所有使用过的类别,您必须查看每个项目一次,因此您几乎无法避免迭代(除非您在构建集合时跟踪使用过的类别)。

如果 Mark Byers 解决方案对您来说足够快,请尝试一下,如果不够快,则只需担心其性能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多