将KeyValue对分组到Dictionary

Roc*_*ngh 3 c# generics dictionary key-value

我有以下代码:

using System.Collections.Generic;


public class Test
{
    static void Main()
    {

        var items = new List<KeyValuePair<int, User>>
                        {
                            new KeyValuePair<int, User>(1, new User {FirstName = "Name1"}),
                            new KeyValuePair<int, User>(1, new User {FirstName = "Name2"}),
                            new KeyValuePair<int, User>(2, new User {FirstName = "Name3"}),
                            new KeyValuePair<int, User>(2, new User {FirstName = "Name4"})
                        };

    }
}
public class User
{
    public string FirstName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

如上所示,同一个密钥有多个用户.现在我想将它们分组并将列表对象转换为字典,其中Key将是相同的(1,2如上所示),但值将是集合.如下所示:

 var outputNeed = new Dictionary<int, Collection<User>>();
        //Output:
        //1,Collection<User>
        //2,Collection<User>
Run Code Online (Sandbox Code Playgroud)

即他们现在分组.

我怎样才能做到这一点?

Ani*_*Ani 6

我建议你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);
Run Code Online (Sandbox Code Playgroud)

当然,如果你确实需要字典(也许允许变通),你可以这样做:

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);
   }
}
Run Code Online (Sandbox Code Playgroud)

另一方面,Collection<T>除非你打算对它进行子类化,否则该类并不是那么有用.你确定你不只是需要List<User>吗?


cfe*_*ern 6

这是使用LINQ的ToDictionary的一个例子:

var output = items.GroupBy(kvp => kvp.Key)
                  .ToDictionary(group => group.Key,
                                group => group.Select(kvp => kvp.Value).ToList());
Run Code Online (Sandbox Code Playgroud)

它导致了一个Dictionary<int,List<User>>.