【问题标题】:How to aggregate data integer in most efficient way?如何以最有效的方式聚合数据整数?
【发布时间】:2012-02-14 13:21:34
【问题描述】:

我需要在 c# 的后台处理作业中从 API 聚合一些数组值。 API 的数量理论上可以是无限的,但可能永远不会超过 10 个。

API 返回一个包含 UserID 和 Value 的简单列表。要在我的应用程序中使用数据,我需要对每个不同的 UserID 的所有值求和。

来自两个 API 的示例数据:

来自 API 1:

[1, 240] (Note: The data is organized as [UserID, Value])
[2, 160]
[3, 12568]
[4, 1780]
[...]

来自 API 2:

[1, 10]
[2, 10]
[3, 10]
[4, 10]
[...]

期望的结果:

[1, 250]
[2, 170]
[3, 12578]
[4, 1790]
[...]

我如何以最有效的方式制作这个所需的列表,其中每个 UserID 的值已相互添加?

我一直在研究 Matrixes,这似乎是一种方法,但我不知道如何在不相互添加用户 ID 的情况下添加值?

(我意识到它可以通过一些嵌套循环来解决,但我正在寻找更好的方法);

注意:用户 ID 不是连续的。

【问题讨论】:

  • 按顺序,你的意思是排序吗?即,流可以是 [3,10]、[1,13] 吗?你想对输出进行排序吗? UserId 总是整数吗?
  • 我猜 Linq 不够快? var results = api1Results.Join(api2Results, api1 => api1.UserId, api2 => api2.UserId, (api1, api2) new { UserId = api1.UserId, Value = api1.Value + api2.Value})
  • @willem 可能存在“间隙”,[1,2,4],其中 3 不在第一个结果中,但可能在第二个结果中。排序无关紧要。是的,总是整数。
  • UserId 总是那么小吗?您希望拥有多少用户?对于少数用户和如此小的 ID,您可以使用桶排序中的想法。
  • @Smudge202 对于列出它可能是,但如果使用 10 仍然是?我有一种感觉,这一定是更好的方法。

标签: c# aggregate calculator aggregation mathematical-optimization


【解决方案1】:

使用Dictionary<int,int> 可能会比你可以用任何其他方式制作的任何东西都要快,即使查找 UserId 是否已经包含为键也是如此。

即:

var results = Dictionary<int,int>();
foreach (var api in apis)
    foreach(var value in api.GetValues())
        if (!result.HasKey(value.UserID))
            result[value.UserId] = value.Value;
        else
            result[value.UserId] += value.Value;

【讨论】:

  • 字典当然是最好的解决方案,除非 ID 是一系列几乎没有间隙的整数。在后一种情况下,我建议使用 List 并忽略未使用的值。在上面给出的代码中,应该使用 result.TryGetValue() 而不是使用 result.HasKey() 和 result[],以将查找操作的数量减半。
猜你喜欢
  • 1970-01-01
  • 2021-05-28
  • 2012-07-18
  • 1970-01-01
  • 1970-01-01
  • 2011-06-17
  • 2017-07-31
  • 2018-01-22
  • 1970-01-01
相关资源
最近更新 更多