c# – 将KeyValue对分组到Dictionary

我有以下代码

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,new User {FirstName = "Name2"}),User>(2,new User {FirstName = "Name3"}),new User {FirstName = "Name4"})
                        };

    }
}
public class User
{
    public string FirstName { get; set; }
}

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

var outputNeed = new Dictionary<int,Collection<User>>();
        //Output:
        //1,Collection<User>
        //2,Collection<User>

即他们现在分组.

我怎样才能做到这一点?

解决方法

我建议你改用 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);
   }
}

另一方面,除非你打算将它子类化,否则theCollection< T>类并不是那么有用.您确定不仅仅需要aList< User>?

相关文章

目录简介使用JS互操作使用ClipLazor库创建项目使用方法简单测...
目录简介快速入门安装 NuGet 包实体类User数据库类DbFactory...
本文实现一个简单的配置类,原理比较简单,适用于一些小型项...
C#中Description特性主要用于枚举和属性,方法比较简单,记录...
[TOC] # 原理简介 本文参考[C#/WPF/WinForm/程序实现软件开机...
目录简介获取 HTML 文档解析 HTML 文档测试补充:使用 CSS 选...