【问题标题】:Invalid anonymous type member declarator c# linq?无效的匿名类型成员声明器c#linq?
【发布时间】:2016-09-26 12:06:49
【问题描述】:

我有这个 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 ​​无效的匿名类型成员声明符。匿名类型 成员必须使用成员分配、简单名称或 会员访问。

有什么帮助吗?

【问题讨论】:

  • new { i.SiteCode = ... - 如果你想动态声明成员名,你不能这样做。
  • 顺便说一句 - 为什么同时使用 ToList()ToArray()?如果你想要的输出是一个数组,只需使用ToArray()
  • 好的,我删除了它。
  • 第一行var inv= 坏了,它不包含结尾} 一方面。
  • 您不能使用动态属性名称创建匿名类型。为什么不简单地反序列化为 JObject 或类似的动态性质?

标签: c# json linq


【解决方案1】:

您不能像使用 linq 那样动态创建属性名称。你必须给出一个具体的名字。如果您想要实现的目标与您描述的一样,那么最好将其转换为字典。像这样的:

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

如果您可能有重复的SiteCodes,那么对于value,您可以使用集合或以其他方式使用ToLookup


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

【讨论】:

  • 这个灵魂不工作,它说名称值和键在当前上下文中不存在
  • @user123456 - 抱歉,值后面有一个错字,它是 = 而不是 =>。固定
  • 实际上,它产生了这个 json [{ "Key" : "AM1", "Value" : { "stock" : 1 } }] 我仍然不想要键和值
  • 我做了这个 var dic = new Dictionary(); foreach(库存中的 var inv){ var val = new { stock = inv.Stock}; if(dic.ContainsKey(inv.SiteCode)) { 继续; } dic.Add(inv.SiteCode, val); } 这得到了我想要的。
  • @user123456 - 对非 linq 来说很好 :) 一点 CR - 使用 if(!....) { did.Add... } 而不是 continue。如果使用 linq,您可以使用 Where 然后 Select
【解决方案2】:

很遗憾,您不能这样做,因为即使该类型是匿名的,它仍然是静态类型(不是动态类型),并且必须在编译时知道。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-30
      • 2015-01-11
      • 1970-01-01
      相关资源
      最近更新 更多