我有一个Dictionary<string, int>
,其中字符串是字符的随机集合,而int是该字符串的ASCII总和。
例如
["aaaaaaaaab", 971],
["aaaaaaaaba", 971],
["aaaaaaabaa", 971],
["aaaaaabaaa", 971]
我想用一个原始的字典创建一个新字典,其中新的键是原始的值,而新的值是List<string>
,它将包含所有以ASCII和为键的字符串。
例如
[971, List<string>{ "aaaaaaaaab", "aaaaaaaaba", "aaaaaaabaa", "aaaaaabaaa"}]
我该如何实现?我无法按照要求的步骤来做。
答案 0 :(得分:2)
可以使用GroupBy
和ToDictionary
前提是:
Value
GroupBy
的值,KeyValuePair
的分组列表,依次从中选择key
(.Select(y => y.Key
)< / li>
示例
var newDict = old.GroupBy(x => x.Value)
.ToDictionary(x => x.Key, x => x.Select(y => y.Key)
.ToList());
其他资源
对序列的元素进行分组。
Enumerable.ToDictionary Method
从
Dictionary<TKey,TValue>
创建一个IEnumerable<T>
。
答案 1 :(得分:1)
由于值不是唯一的,因此在转换为字典之前,您需要按Value
进行分组:
var inverse = original
.GroupBy(p => p.Value)
.ToDictionary(g => g.Key, g => g.Select(p => p.Key).ToList());
答案 2 :(得分:0)
如果要在没有Linq的情况下执行此操作,则可以执行以下操作:
foreach(KeyValuePair<string, int> entry in dict) {
if(!dict2.ContainsKey(entry.Value)) {
dict2[entry.Value] = new List<string>();
}
dict2[entry.Value].Add(entry.Key);
}
假设您将dict定义为Dictionary<string, int> dict
,而dict2定义为Dictionary<int, List<string>> dict2
答案 3 :(得分:0)
对于没有LINQ的人来说,这是一个完整的示例。
override func viewDidLoad() {
super.viewDidLoad()
startScreenSleep()
}
输出:
using System;
using System.Collections.Generic;
public class Program
{
public static void Main()
{
Dictionary<string,int> origDict = new Dictionary<string,int>{{"tttt",1},{"fttt",1},{"fftt",2}};
var vals = new int[origDict.Count];
origDict.Values.CopyTo(vals,0);
var keys = new string[origDict.Count];
origDict.Keys.CopyTo(keys,0);
Dictionary<int,List<string>> newDict = new Dictionary<int,List<string>>();
for(int i = 0; i < vals.Length; i++){
int val = vals[i];
if(newDict.ContainsKey(val)){
newDict[val].Add(keys[i]);
}else{
newDict[val] = new List<string>();
newDict[val].Add(keys[i]);
}
}
foreach(var key in newDict.Keys){
Console.WriteLine(key);
foreach(var val in newDict[key]){
Console.WriteLine(val);
}
}
}
}