Я бы предложил вам использовать Lookup<TKey, TElement>
. Эта структура данных специально предназначена для использования в качестве карты от ключей до коллекций значений.
//uses Enumerable.ToLookup: the Id is the key, and the User object the value
var outputNeeded = items.ToLookup(kvp => kvp.Key, kvp => kvp.Value);
Конечно, если вам нужен словарь (возможно, для обеспечения изменчивости), вы можете сделать что-то вроде:
var outputNeeded = new Dictionary<int, Collection<User>>();
foreach(var kvp in list)
{
Collection<User> userBucketForId;
if(!outputNeeded.TryGetValue(kvp.Key, out userBucketForId))
{
// bucket doesn't exist, create a new bucket for the Id, containing the user
outputNeeded.Add(kvp.Key, new Collection<User> { kvp.Value });
}
else
{ // bucket already exists, append user to it.
userBucketForId.Add(kvp.Value);
}
}
С другой стороны, класс Collection<T>
не так уж и полезен, если только вы не собираетесь его подклассировать. Вы уверены, что вам не нужен List<User>
?