无效的匿名类型成员声明符c#linq?

时间:2016-09-26 12:06:50

标签: c# json linq

我有这个json结构:

[
  {
    "code": "T01",
    "stock": 0
  },
  {
    "code": "T02",
    "stock": 1
  }
]

我如何实现他的结构:

[{ 
 T01: {
     stock: 0
 }
}, {
  T02: {
     stock: 1
 }
}]

在C#中使用linq。

目前我有这行代码:

var inv = inventory.Select(i => new { code = i.SiteCode, stock = i.Stock).ToList().ToArray();

inv的值将获得第一个结构结果。

我正在尝试做这样的事情:

inv = inventory.Select(i => new {  i.SiteCode = new { stock = i.Stock} }).ToList().ToArray();

我收到以下编译错误:

  

错误1无效的匿名类型成员声明符。匿名类型   必须使用成员作业,简单名称或成员声明成员   会员访问。

任何帮助?

3 个答案:

答案 0 :(得分:3)

您无法像使用linq那样动态创建属性名称。您必须提供特定名称。如果您想要实现的就像您描述的那样,那么最好将其转换为字典。像这样:

var inv = inventory.ToDictionary(key => key.SiteCode, value => new { Stock = value.Stock});

如果您可能有SiteCode个重复,那么可以使用value,您可以使用集合或以其他方式使用ToLookup

关于ToArray / ToList的用法 - 大多数linq的方法执行不同,更像是关于做什么(查询)的说明。在添加ToList / ToArray / FirstOrDefault / Sum等方法时 - 仅在此时查询实际执行并返回结果。在上面的例子中,您使用.ToList().ToArray() - 执行linq并为List返回,然后将其转换为数组。根据您想要的输出(或根据我上面的建议转换为字典或查找

),仅使用其中一个

答案 1 :(得分:0)

不幸的是你无法做到这一点,因为即使该类型是匿名的,它仍然是静态类型(不是动态类型),并且必须在编译时知道。

答案 2 :(得分:0)

对于这个结构(我已经创建了一个代表你的类):

class A
{
    public string code { get; set; }
    public int stock { get; set; }
}

我制作了以下算法,不太好但是给出了一些你在问什么:

var objects = new List<A> { new A { code = "T01", stock = 1 }, new A { code = "T02", stock = 2 } };
string s = "[";
objects.ForEach(x => s += "{" + x.code + ": {stock: " + x.stock + "}},");
s = s.Remove(s.Length - 1, 1);
s += "]";

您可以通过在需要的位置添加空格来完成格式化,但同样,您要查找的内容不是有效的json格式。