【问题标题】:How convert a List<Dictionary<string, object>> to a List<string> of each item's "name" property in a lambda?如何将 List<Dictionary<string, object>> 转换为 lambda 中每个项目的“名称”属性的 List<string>?
【发布时间】:2017-05-10 19:44:29
【问题描述】:

我有一个List&lt;Dictionary&lt;string, object&gt;&gt;,其值如下:

{ name: "Joe", age: 23, ... },
{ name: "Jack", age: 19, ... },
...

我想创建一个List&lt;string&gt; 来保存名称。

我该怎么做(连同演员表)?

我知道如何按名称选择值,但是如何使用 lambda 返回 name 字段并将其转换为列表的字符串?

是这样吗?

List<string> names = objects.Select(
    item => item[ "name" ].ToString()
).ToList<string>();

【问题讨论】:

  • 你为什么不试试呢。
  • 好像没问题。 ToString() 这一行中的方法:tem[ "name" ].ToString() 是多余的。
  • @MaciejLos 是必要的,因为 OP 的字典将对象作为值,而不是字符串,所以你必须转换或转换它。
  • 如果您在List&lt;Dictionary&lt;string, object&gt;&gt; 中包含几行将示例数据加载到的行会很好
  • 您声明 Values 看起来像:{ name: "Joe", age: 23, ... }。但稍后您使用字符串"name" 引用Key。哪些是键,值是什么样的?

标签: c# dictionary lambda


【解决方案1】:

看看这是否有效:

var names = objects.Select(item => (string)item["name"]).ToList();

但是,如果我可以提出建议,您不应该以这种方式使用字典。考虑为字典中的数据创建一个类。

class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    // etc
}

【讨论】:

  • 我不是那样“使用”字典,它是在从数据库请求数据后从另一个库返回给我的。它代表数据的行。
【解决方案2】:

由于值存储在字典中,因此键可能不一定存在。要防范KeyNotFoundException,请使用Dictionary(TKey, TValue).TryGetValue(TKey, TValue)

var objects = new List<Dictionary<string, object>>
{
    new Dictionary<string, object>
    {
        {"name", "Foo"}
    },
    new Dictionary<string, object>
    {
        {"name", "Bar"}
    },
    new Dictionary<string, object>
    {
        {"blah", "Baz"}
    }
};

// C# Local function
IEnumerable<string> GetName(IDictionary<string, object> obj)
{
    // C# 7 out variable
    if (obj.TryGetValue("name", out var name))
    {
        yield return name as string;
    }
}

// ["Foo", "Bar"]
var names =
    objects
        .SelectMany(GetName)
        .ToList();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    • 1970-01-01
    • 2020-11-27
    相关资源
    最近更新 更多