C# LINQ在选择作为字典的属性时创建新的匿名类型
我有一个简单的POCO,如下所示:C# LINQ在选择作为字典的属性时创建新的匿名类型,c#,linq,C#,Linq,我有一个简单的POCO,如下所示: [JsonObject(NamingStrategyType = typeof (CamelCaseNamingStrategy))] public class MyType { public string Id { get; set; } public string Name; [JsonExtensionData(ReadData = true, WriteData = true)] public IDictionar
[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; }
}
但是,当我运行此程序时,我得到的是一个字典列表,但其形状如下:
[
{TypeDetails: {the dictionary i want},
{TypeDetails: {the dictionary i want}},
(...)
]
我所期待的是:
[
{the dictionary i want},
{the dictionary i want},
(...)
]
澄清一下:我希望这是真的:
类型[0]。类型详细信息。相等值[0]
就像我在做的一样
types.Select((myType) => new {myType.TypeDetails})
如果我得到任何其他属性,则select的行为与我预期的一样。
我找不到任何文件表明字典是否得到了特殊处理,也找不到任何其他关于为什么会发生这种情况的线索 使用字典的值,如下所示:
types.SelectMany((myType) => myType.TypeDetails.Values)
您的退货期望/说明不符合以下条件之一: 我正试图返回一份字典列表 或者,假设myType为myType类型,则实际代码不匹配: types.SelectmyType=>myType.TypeDetails 下面的示例代码确实返回了一个字典集合,看看您的代码与它的不同之处会很有趣:
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);
你试过了吗?用.SelectMany代替.SelectmyType.TypeDetails.Values代替myType.TypeDetails会有什么问题?我不明白你的问题,types.SelectmyType=>myType.TypeDetails会产生一个IEnumerable,看起来像你想要的?或者将其放入一个列表types.SelectmyType=>myType.TypeDetails.ToList?请详细说明…我无法重新创建您的IssueWLP@AussieJoe的评论给了我正确的方向。使用.Values屏蔽了包含我想要的dict的集合集合。所以我把Select改为SelectMany,它给了我正确的结果。这行代码的结尾是这样的:types.selectManyType=>myType.TypeDetails.Values@AussieJoe如果你愿意,把它写下来作为一个响应,我会把它标记为答案。这个集合里面有什么?如果运行数据[0].TypeDetails.equalsr[0]true会发生什么?这是刚才看到你的评论的同一个对象-看起来它是我建议的前一个对象-你不想要字典列表,你想要字典中包含的值的列表。是的,值和键。已经有一段时间了,我的C显然比我想象的要粗糙_ツ_/¯. 我必须考虑一下,因为我在解析过程中遇到了困难。
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);