Самый простой ответ: использовать LINQBridge и получить все ваши LINQ к объектам благость против .NET 2.0 ... работает лучше, если вы можете использовать C# 3 (то есть VS2008, но таргетинг .NET 2.0).
Если вы действительно не можете этого сделать, вам в основном нужно будет сохранить словарь от ключа до списка значений. Итерации по последовательности и проверьте, содержит ли он уже список - если нет, добавьте его. Затем добавьте в список, который вы нашли (новый или старый).
Если вам нужно вернуть группы в порядке очереди, вам также необходимо сохранить список ключей в том порядке, в котором вы их нашли. Честно говоря, это боль ... просто возьмите LINQBridge :)
(Серьезно, каждый отдельный бит LINQ на самом деле довольно прост в написании, но также довольно легко сделать ошибки «за собой» или забыть оптимизировать что-то вроде Count()
в том случае, когда это на самом деле ICollection<T>
... Там нет необходимости изобретать колесо здесь)
EDIT:. Я собирался написать код, но потом я заметил, что вы хотите список вернулся ... список чего? A List<IList<IObject>>
? Или вы на самом деле пытаетесь группировать и суммировать за один раз? Если это так, вам не нужен список пар ключей и суммы? Или вы собираетесь повторно использовать тот же класс, который у вас уже есть для одной учетной записи, но как совокупность? Если это последнее, вот некоторые примеры кода:
public static IList<IObject> SumAccounts(IEnumerable<IObject> data)
{
List<IObject> ret = new List<IObject>();
Dictionary<string, IObject> map = new Dictionary<string, IObject>();
foreach (var item in data)
{
IObject existing;
if (!map.TryGetValue(item.Account, out existing))
{
existing = new IObject(item.Account, 0m);
map[item.Account] = existing;
ret.Add(existing);
}
existing.Amount += item.Amount;
}
return ret;
}
Правда дополнительная эффективность здесь в связи с использованием Dictionary
для поисков будет бессмысленно, если вы не получили на самом деле довольно много счетов ...
EDIT: Если у вас есть небольшое количество счетов, как на ваш комментарий, вы можете использовать:
public static IList<IObject> SumAccounts(IEnumerable<IObject> data)
{
List<IObject> ret = new List<IObject>();
foreach (var item in data)
{
IObject existing = ret.Find(x => x.Account == item.Account);
if (existing == null)
{
existing = new IObject(item.Account, 0m);
ret.Add(existing);
}
existing.Amount += item.Amount;
}
return ret;
}
erm, вы пишете цикл. –
Спасибо, у меня есть один, но то, что у меня кажется слишком сложным. – Martin
Вы не показали, что такое ListofObjects, но это не выглядит ужасно эффективным ... я предполагаю, что у вас есть группа O (n^2). –