【问题标题】:Improve performance on List<byte[]>.Count by criteria提高 List<byte[]>.Count by criteria 的性能
【发布时间】:2015-08-18 07:42:31
【问题描述】:

我有一个List&lt;byte[]&gt;,我将信息加载到代表矩阵中。数组中的每个byte 代表每个条件它所属的段。所以可以有多个标准,比如年龄、收入等,每个标准都会被细分。

此字节数组在 HEX 中的外观示例是 0x0D1A0006

我在一个带有控件的表单上表示矩阵,该控件是根据有多少个 Criteria 项以及每个 Criteria 有多少个 Segment 而创建的,并且每个控件都知道它属于哪个条件以及条件的哪个段。

然后我遍历控件并使用 lambda 表达式 FilteredData.Count(x =&gt; x[curCriteria] == curSegment) 来确定列表中与 curCriteriacurSegment 对应的所有项目的计数。

有没有办法通过不循环通过控件来获取计数,而是为我返回特定条件中每个段的计数?比如:

int[] = FilteredData.Count(x => x[curSegment]).ToArray<int>()

这是一些测试数据。

0x0E0C060E0003070C0203000A0B090B00
0x010C060E0004020C020309090B010B00
0x050C060E0001070C020500080B080B00
0x000C060E0004060C020D090C01040B00
0x070C080E0003040C0005010D0B0D0B00
0x050C060E0001050C020C090B0B030B00
0x0D0C060E0003080C0203030A0D080B00
0x030C060E0004040C02010008070A0B00
0x0A0C060E0004050C020C020B0B0C0B00
0x050C020E0001020C01050A060B020B00
0x050C060E0003080C020D000C08030B00
0x040C060E0000050C020D030C0B060000
0x000C030E0007040C070709050C090B00

我的矩阵基本上是 15 个 Criteria 的,布局如下:

Criteria 1, 15 Segments
Criteria 2, 13 Segments
Criteria 3, 10 Segments
Criteria 4, 15 Segments
Criteria 5, 9 Segments
Criteria 6, 8 Segments
Criteria 7, 10 Segments
Criteria 8, 14 Segments
Criteria 9, 15 Segments
Criteria 10, 15 Segments
Criteria 11, 11 Segments
Criteria 12, 15 Segments
Criteria 13, 14 Segments
Criteria 14, 15 Segments
Criteria 15, 13 Segments

每个条件可以有 30-40 个条件和最多 64 个细分

【问题讨论】:

  • List 具有属性 Count 以返回所有项目的数量。如果您应用过滤器,则无法避免迭代。您可以尝试缓存结果并在集合更改时使其无效。
  • 我不想要列表中的 Count,我想从样本数据中查看列表中有多少选择了 Segment 1 Criteria 1 等,Segment 1 将具有以下值 @987654333 @
  • 在不知道数据细节的情况下很难说,但是对底层数据的一些抽象可能是有序的,任何使用这种代码的人都会遇到困难,而且很难找到错误.作为该抽象的一部分,您可以提供优化(如 Sinatr 所说的缓存)以提高性能。
  • 为什么要这样做?你有性能问题吗?除非存在性能问题,否则请尽可能使用最简单的代码 - 有办法对此进行优化(当然,有自己的权衡),但它们会损害可读性和内存使用。鉴于您为标准和细分提供的数字,我发现您不太可能遇到性能问题 - 除非您在某处循环执行此操作。

标签: c# performance collections count


【解决方案1】:

也许这是一个非常简单的解决方案,但您可以将您的项目与“所有类型的项目列表”一起存储在单独的列表中,然后访问单独列表中的 Count 属性以获取特定类型项目的计数。

换句话说:不是按条件查询计数,而是按条件存储数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-17
    • 2011-04-24
    • 1970-01-01
    相关资源
    最近更新 更多