Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无效的匿名类型成员声明符c#linq?_C#_Json_Linq - Fatal编程技术网

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

无效的匿名类型成员声明符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", "

我有这个json结构:

[
  {
    "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
,然后
选择