【问题标题】:How to convert Dictionary to List with mixing of values and keys?如何通过混合值和键将字典转换为列表?
【发布时间】:2015-11-12 13:17:11
【问题描述】:

我有一些字典。顺其自然:

var dictionary = new Dictionary< string, List<MyClass>>();

我需要将其转换为包含键和值属性的对象列表。 我用 foreach 循环用下一个方法做到了:

var list = new List<dynamic>();
foreach (var key in dictionary.Keys)
{
    var values = dictionary[key];

    foreach (var obj in values)
    {
        list.Add(new
        {
            obj.Property0,
            obj.Property1,
            obj.Property2,
            ...
            key
        }
        );
    }
}

它有效,但对我来说看起来很粗鲁。是否可以使用 LINQ 更优雅地做到这一点?

【问题讨论】:

  • 你能显示MyClass的代码吗?我假设它实现了IEnumerable,因为您在values 上执行foreach。
  • 确实 - 一个简短但完整的示例将使这对您有所帮助。
  • @juharr 谢谢你,我错过了它是 MyClass 的列表。

标签: c# linq dictionary


【解决方案1】:

您可以使用SelectMany 来做到这一点。

var list = dictionary.SelectMany(
        kvp => kvp.Value, 
        (kvp,obj) => new {obj.Property0, obj.Property1, obj.Property2, kvp.Key})
    .ToList();

或者在查询语法中

var list = (from kvp in dictionary
           from obj in kvp.Value
           select new {obj.Property0, obj.Property1, obj.Property2, kvp.Key})
    .ToList();

请注意,这会生成一个匿名类的列表。如果你真的想要dynamic,你需要在ToList() 之前做一个Cast&lt;dynamic&gt;()。此外,如果您希望匿名类的最后一个属性是 key 而不是 Key,您需要使用 key = kvp.Key。

【讨论】:

  • 如果你真的想要一个列表,请在最后打一个.ToList()。
  • @MatthewWatson 非常正确,已修复。
  • 很好的解决方案。这就是我正在寻找的。谢谢!
猜你喜欢
  • 2020-02-14
  • 1970-01-01
  • 1970-01-01
  • 2021-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-03
  • 1970-01-01
相关资源
最近更新 更多