c# – 将KeyValue对分组到Dictionary
发布时间:2020-12-16 00:14:37 所属栏目:百科 来源:网络整理
导读:我有以下代码: using System.Collections.Generic;public class Test{ static void Main() { var items = new ListKeyValuePairint,User { new KeyValuePairint,User(1,new User {FirstName = "Name1"}),new KeyValuePairint,new User {FirstName = "Name2"
我有以下代码:
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>? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |