【问题标题】:Convert a Dictionary<string,List<string>> into a List<string,string>将 Dictionary<string,List<string>> 转换为 List<string,string>
【发布时间】:2020-06-19 13:00:17
【问题描述】:

我正在使用字典 Dictionary&lt;string,List&lt;string&gt;&gt; 将具有类似

的值
Key        ||        Values
1                     a,b,c
2                     d,e

我想将此字典转换为 MyClass 类型的对象列表

MyClass 有两个属性,即

Class MyClass{
 public string ID { get; set; }
 public string Name { get; set; }
}

会是什么

1 ,  a
1 ,  b
1 ,  c
2 ,  d
2 ,  e

我尝试了一些方法,例如使用 Keys.Tolist 和 Values.ToList,但未能成功获得我需要的东西。

我知道这可以使用循环来完成,但我不喜欢使用它,因为我将处理的数据将是数十万个,即数十万个键和数千万个值。

有人可以帮我找到一种有效的方法来解决这个问题吗?

【问题讨论】:

  • 你可以只做dictionary.SelectMany(kvp =&gt; kvp.Value.Select(name =&gt; new MyClass { ID = kvp.Key, Name =name })).ToList(),但这仍然会在幕后循环

标签: c# list dictionary .net-core


【解决方案1】:

您可以在一行中执行此操作并使用SelectMany 方法将字典值展平,但它仍在使用引擎盖下的循环

var dict = new Dictionary<string, List<string>>
{
    { "1", new List<string> { "a", "b", "c" } },
    { "2", new List<string> { "d", "e" } }
};

var result = dict
    .SelectMany(kvp => kvp.Value, (kvp, s) => new MyClass { ID = kvp.Key, Name = s })
    .ToList();

【讨论】:

    【解决方案2】:

    您可以通过使用来自 LINQ 的 select 语句的字符串来展平您的列表。首先,迭代字典集合,然后在内部迭代字符串列表并从中创建新对象。下面我放了一个例子,应该可以帮助你理解它。

        public class MyClass
        {
            public string Id { get; set; }
            public string Name { get; set; }
        }
    
        var list = new List<string>
        {
            "a",
            "b",
            "c"
        };
    
        var list2 = new List<string>
        {
            "d",
            "e"
        };
    
        var dict = new Dictionary<string,List<string>>();
        dict.Add("1", list);
        dict.Add("2", list2);
    
        var x = dict.SelectMany(x => x.Value.Select(z => new MyClass
        {
            Id = x.Key,
            Name = z
        })).ToList();
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多