0

我需要從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] 
[...] 

如何以最有效的方式創建這個期望列表,其中每個用戶標識的值已相互添加?

我一直在看Matrixes這似乎是一種方式,但我無法弄清楚如何添加值而不添加用戶ID到對方? (我知道它可以用一些嵌套的循環來解決,但我正在尋找更好的方法);

注意:UserID不是順序的。

+0

通過連續的,你的意思排序?也就是說,流是[3,10],[1,13]?你想要排序輸出嗎? UserIds是否總是整數? – willem 2012-02-14 13:27:40

+0

林猜測Linq速度不夠快? 'var results = api1Results.Join(api2Results,api1 => api1.UserId,api2 => api2.UserId,(api1,api2)new {UserId = api1.UserId,Value = api1.Value + api2.Value})' – Smudge202 2012-02-14 13:29:31

+0

@ willem可能存在「空白」[1,2,4],其中3不在第一個結果中,但可能在第二個結果中。排序並不重要。是的,總是整數。 – 2012-02-14 13:30:55

回答

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; 
+0

字典當然是最好的解決方案,除非ID是一系列幾乎沒有空白的整數。在後一種情況下,我建議使用List並忽略未使用的值。 應該在上面給出的代碼中使用result.TryGetValue()來代替使​​用result.HasKey()和result [],以減少查找操作的數量。 – Reinhard 2012-02-15 08:00:51

相關問題