【问题标题】:C# Create a Dictionary from List<Dictionary>C# 从 List<Dictionary> 创建字典
【发布时间】:2017-01-28 04:24:53
【问题描述】:

我有一个字典列表,例如:

dic1.Add("A_key1","A_val11"); dic1.Add("B_key1","B_val11")
dic1.Add("C","C"); dic1.Add("D","D");

dic2.Add("A_key1","A_val21");  dic1.Add("B_key1","B_val21");
dic2.Add("C","C");  dic1.Add("D","D");
dic2.Add("A_key2","A_val22");  dic1.Add("B_key2","B_val22");
dic2.Add("A_key3","A_val23");  dic1.Add("B_key3","B_val23");

List<Dictionary<string,string>> tempList = new List<Dictionary<string,string>>{dic1, dic2};

我需要从 tempList 遵循规则创建一个字典:key = "A_key*" value, val = "B_key*" value 从列表中的所有原始字典。 例如,在上面的例子中:

expectDic = {("A_val11","B_val11"),
              ("A_val21","A_val21"),
              ("A_val22","A_val22"),
              ("A_val23","A_val23")}

我可以用 Linq 解决吗?

【问题讨论】:

  • SelectManyToDictionary 的组合可能会成功
  • 永远只有两本字典吗?两个字典中没有匹配键的项目怎么办?
  • 不太清楚。除了第一个条目之外,键和值是相同的。你能解释得更好吗?
  • 缺少 dic2。已编辑

标签: c# linq list generics dictionary


【解决方案1】:

您的问题不清楚,所以我将做一些假设。如果这些假设不正确,请告诉我并酌情修改。

关闭你的测试数据,因为键是相同的,合并字典是不可能的,因此是列表。

最后,您的测试数据本身是不正确的,因为它会引发异常。因此,我假设测试数据如下:

        Dictionary<string, string> dic1 = new Dictionary<string, string>();
        Dictionary<string, string> dic2 = new Dictionary<string, string>();

        dic1.Add("A_1", "A_val11");
        dic1.Add("B_1", "B_val11");
        dic1.Add("C", "C");
        dic1.Add("D", "D");


        dic2.Add("A_1", "A_val21");
        dic2.Add("A_2", "A_val22");
        dic2.Add("A_3", "A_val23");
        dic2.Add("B_1", "B_val21");
        dic2.Add("B_2", "B_val22");
        dic2.Add("B_3", "B_val23");
        dic2.Add("C", "C");
        dic2.Add("D", "D");


        List<Dictionary<string, string>> tempList = new List<Dictionary<string, string>> { dic1, dic2 };

下面是一些适用于给定示例的代码:

Dictionary<string, string> expectDic = new Dictionary<string, string>();
        for (int i = 0; i < tempList.Count; i++)
        {
            Dictionary<string, string> onedic = tempList[i];
            while (onedic.Values.ToList().Where(x => x.Contains("A_")).FirstOrDefault() != null)
            {
                expectDic.Add(onedic.Select(x => x.Value).Where(x => x.Contains("A_") && !expectDic.Keys.Contains(x)).First(), onedic.Select(x => x.Value).Where(x => x.Contains("B_") && !expectDic.Values.Contains(x)).First());
                onedic.Remove(onedic.Select(x => x.Key).Where(x => x.Contains("A_")).FirstOrDefault());
                onedic.Remove(onedic.Select(x => x.Key).Where(x => x.Contains("B_")).FirstOrDefault());
            }
        }

但是,您要求的内容非常复杂,我建议对 LINQ 进行异常处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-15
    • 1970-01-01
    • 1970-01-01
    • 2014-12-03
    • 1970-01-01
    相关资源
    最近更新 更多