2016-09-26 52 views
1

我有这样的JSON结构:无效的匿名类型成员声明c#linq?

[ 
    { 
    "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

'new {i.SiteCode = ...' - 如果你想动态声明成员名称,你不能这样做。 – kiziu

+4

顺便说一句 - 为什么同时使用'ToList()'和'ToArray()'?如果你想要的输出是一个数组,只需使用'ToArray()' –

+0

好吧,我删除它。 – user123456

回答

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,然后将其转换为数组。仅使用两个中的一个根据您想要的输出(或我的建议上述转换成字典或查找

+0

这灵魂没有任何作用,它是说在当前上下文中不存在名称值和密钥 – user123456

+0

@ user123456 - 对不起,在值为'='而不是'=>'后出现拼写错误。固定 –

+0

@ user123456 - 这有助于您解决问题吗? –

0

可惜你不能做到这一点,因为即使类型是匿名的,它仍然是一个静态类型(不是动态的),它必须在编译时已知

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格式。