我有这个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无效的匿名类型成员声明符。匿名类型 必须使用成员作业,简单名称或成员声明成员 会员访问。
任何帮助?
答案 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格式。