无效的匿名类型成员声明符c#linq?
我有这个json结构:无效的匿名类型成员声明符c#linq?,c#,json,linq,C#,Json,Linq,我有这个json结构: [ { "code": "T01", "stock": 0 }, { "code": "T02", "stock": 1 } ] [{ T01: { stock: 0 } }, { T02: { stock: 1 } }] 我如何实现他的结构: [ { "code": "T01", "stock": 0 }, { "code": "T02", "
[
{
"code": "T01",
"stock": 0
},
{
"code": "T02",
"stock": 1
}
]
[{
T01: {
stock: 0
}
}, {
T02: {
stock: 1
}
}]
我如何实现他的结构:
[
{
"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无效的匿名类型成员声明符。匿名类型
必须使用成员赋值、简单名称或
成员访问
有什么帮助吗?您不能像使用linq那样动态创建属性名。您必须给出一个特定的名称。如果你想要实现的是你所描述的,那么最好把它转换成字典。大概是这样的:
var inv = inventory.ToDictionary(key => key.SiteCode, value => new { Stock = value.Stock});
如果您可能有重复的站点代码
s,那么对于值
,您可以使用集合或使用ToLookup
关于
ToArray
/ToList
的用法-linq的大多数方法执行起来不同,更像是关于做什么(查询)的指令。当添加类似于ToList
/ToArray
/FirstOrDefault
/Sum
的方法时——只有在这一点上,查询才会实际执行并返回结果。在上述情况下,您使用.ToList().ToArray()
-执行linq并返回列表
,然后将其转换为数组。根据您想要的输出,只使用这两种类型中的一种(或者按照我上面的建议,转换为字典或查找),不幸的是,您不能这样做,因为即使类型是匿名的,它仍然是静态类型(不是动态类型),并且必须在编译时知道它。对于这种结构(我已经创建了一个类来表示您的类型):
我制作了以下算法,虽然不是很好,但给出了一种你想问的问题:
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 += "]";
var objects=newlist{newa{code=“T01”,stock=1},newa{code=“T02”,stock=2};
字符串s=“[”;
ForEach(x=>s+=“{+x.code+”:{stock:“+x.stock+”},”);
s=s.Remove(s.Length-1,1);
s+=“]”;
您可以通过在需要的地方添加空格来完成格式化,但同样,您要查找的不是有效的json格式。
new{i.SiteCode=…
-如果您想动态声明成员名称,您不能这样做。顺便问一句-为什么同时使用ToList()
和ToArray()
?如果您想要的输出是一个数组,只需使用ToArray()
ok,我将其删除。第一行var inv=
断开,它不包含结尾}
首先,您无法创建具有动态属性名称的匿名类型。为什么不简单地反序列化为JObject
或类似的动态类型?此解决方案无效,它意味着当前属性中不存在名称值和键context@user123456-很抱歉,在值为=
ins后有一个输入错误除了=>
.fixed实际上,它生成了这个json[{“Key”:“AM1”,“Value”:{“stock”:1}]我仍然不想要这个键和值我做了这个var dic=new Dictionary();foreach(var inv in inventory){var val=new{stock=inv.stock};如果(dic.ContainsKey(inv.SiteCode)){continue;}dic.Add(inv.SiteCode,val);}这就得到了我想要的。@user123456-对非linq:来说很好:)一点CR-如果(!…){did.Add…,做一个
而不是continue
。如果使用linq,您可以使用Where
,然后选择