0

Мне нужно агрегировать некоторые значения массива из API в задании фоновой обработки в C#. Количество API может теоретически быть бесконечным, но, вероятно, никогда не будет больше 10.Как суммировать целое число данных наиболее эффективным способом?

API-интерфейсы возвращают простой список с UserID и Value. Чтобы использовать данные в моем приложении, мне нужно суммировать все значения для каждого отдельного UserID.

Пример-данные из двух интерфейсов:

От 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 были добавлены друг к другу?

Я смотрел Матрицы, которые, кажется, являются способом, но я не могу понять, как сделать добавление значений, не добавляя также UserID друг к другу?

(Я понимаю, что это можно решить с помощью некоторых вложенных циклов, но я ищу лучший способ);

Примечание. Пользовательские идентификаторы не являются последовательными.

+0

последовательным, вы имеете в виду отсортирован? Ie, может ли поток быть [3,10], [1,13]? Вы хотите, чтобы результат сортировался? Являются ли UserIds всегда целыми числами? – willem

+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

+0

@willem Могут быть «пробелы», [1,2,4], где 3 не находится в первом результате, но может быть во втором результате. Сортировка не имеет значения. Да, всегда целые числа. –

ответ

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

Словарь, безусловно, является лучшим решением, за исключением случаев, когда идентификаторы представляют собой серию целочисленных чисел с почти отсутствием пробелов. В последнем случае я предлагаю использовать список и игнорировать неиспользуемые значения. Вместо использования result.HasKey() и result [], result.TryGetValue() следует использовать в приведенном выше коде, чтобы сократить количество операций поиска. – Reinhard