LINQ在选择字典属性

时间:2018-05-14 21:02:21

标签: c# linq

我有一个像这样的简单POCO:

[JsonObject(NamingStrategyType = typeof (CamelCaseNamingStrategy))]
public class MyType
{

    public string Id { get; set; }

    public string Name;

    [JsonExtensionData(ReadData = true, WriteData = true)]
    public IDictionary<string, object> TypeDetails { get; set; }
}

和一个给我一个MyType列表的方法 我正在尝试返回Dictionary<string,object>的列表,其中包含我获得的对象列表的所有TypeDetails。 像这样:

types.Select((myType) => myType.TypeDetails)

然而,当我运行它时,我得到的是一个字典列表,但具有以下形状:

[
  {TypeDetails: {the dictionary i want},
  {TypeDetails: {the dictionary i want}},
  (...)
]

我的期待:

[
  {the dictionary i want},
  {the dictionary i want},
  (...)
]

澄清:我希望这是真的: types[0].TypeDetails.equals(r[0])

就像我在做什么一样

types.Select((myType) => new {myType.TypeDetails})

如果我得到任何其他属性,那么select就像我预期的那样。 我找不到任何表明字典是否得到特殊处理的文档,也没有任何其他线索可以解释为什么会出现这种情况。

2 个答案:

答案 0 :(得分:0)

在词典的上使用.SelectMany(),如下所示:

types.SelectMany((myType) => myType.TypeDetails.Values)

答案 1 :(得分:0)

你的回报期望/描述都是:

  

我正在尝试返回Dictionary<string,Object>

列表

或,(假设(myType)的类型为MyType),您的真实代码不匹配:

  

types.Select((myType)=&gt; myType.TypeDetails)

下面的示例代码确实返回了Dictionary<string,Object>的集合,看看代码与它的不同之处会很有趣:

var data = new[]
{
    new MyType()
    {
        TypeDetails = new Dictionary<string, object>() { { "foo", "bar" } }
    },
    new MyType()
    {
        TypeDetails = new Dictionary<string, object>() { { "baz", "qux" } }
    },
};
var r = data.Select(d => d.TypeDetails);