从旧词典填充新词典

时间:2020-02-03 00:23:00

标签: c# dictionary

我有一个Dictionary<string, int>,其中字符串是字符的随机集合,而int是该字符串的ASCII总和。

例如

    ["aaaaaaaaab", 971],
    ["aaaaaaaaba", 971],
    ["aaaaaaabaa", 971],
    ["aaaaaabaaa", 971]

我想用一个原始的字典创建一个新字典,其中新的键是原始的值,而新的值是List<string>,它将包含所有以ASCII和为键的字符串。

例如

    [971, List<string>{ "aaaaaaaaab", "aaaaaaaaba", "aaaaaaabaa", "aaaaaabaaa"}]

我该如何实现?我无法按照要求的步骤来做。

4 个答案:

答案 0 :(得分:2)

可以使用GroupByToDictionary

前提是:

  1. 按照旧的Value
  2. 分组 给定GroupBy的值,
  3. 项目到新的 dictionary
    • 将是原始词典中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.GroupBy Method

对序列的元素进行分组。

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);
            }
        }
    }
}