【问题标题】:Need Linq Help Selecting List of Tags Using JSON.NET需要 Linq 帮助使用 JSON.NET 选择标签列表
【发布时间】:2016-12-07 15:29:26
【问题描述】:

我有一个 JSON 文件,其中包含一个按键图标列表,每个按键都有一个标签列表。它看起来像这样:

{
  "IconTags": [
    {
      "Key": "Com_Active",
      "Tags": [
        "Green",
        "Circle",
        "Active"
      ]
    },
    {
      "Key": "Com_Add",
      "Tags": [
        "Green",
        "Plus",
        "Add"
      ]
    }
  ] 
}

在运行时,使用 JSON.NET,我想解析 JSON 以获得特定图标键并返回标签列表。

这是我目前拥有的:

JObject iconTags = JObject.Parse(File.ReadAllText(@"IconTags.json"));

var tags = from i in iconTags["IconTags"] 
    where i["Key"].Value<string>() == "Com_Add" 
    select i["Tags"].Values<string>();

这可行,但它返回IEnumerable&lt;IEnumerable&lt;String&gt;&gt;

我希望我的 Linq 查询只返回 IEnumerable&lt;String&gt;

你们中的任何一位出色的专家可以帮助我解决我的 Linq 查询吗?

干杯!

【问题讨论】:

    标签: c# json linq json.net


    【解决方案1】:

    您可以改用 SelectMany,这将展平所有可枚举。

    iconTags["IconTags"].Where(i => i["Key"].Value<string>() == "Com_Add" )
     .SelectMany(i => i["Tags"].Values<string>());
    

    您可以在MSDN 文章中获取更多信息

    【讨论】:

    • SelectMany 函数缺少 Anders 箭头。应该是:.SelectMany(i =&gt; i["Tags"].Values&lt;string&gt;());
    • @Keith 谢谢,我错过了我写得很快,我做了那些改变
    • 我真的很喜欢使用这种语法。有没有办法让我接受两个正确的答案?
    • @Keith,您在上面选择的答案只会获得第一个可枚举的,而不是将它们展平,您可能会丢失结果。例如,如果你有一个可枚举的可枚举,它只会抓住第一个可枚举并忽略其余的
    • @Keith 我也比较喜欢这个语法,一开始有点迷糊,但是看起来更像代码而不是sql,而且大部分时间都比较容易阅读
    【解决方案2】:

    你需要有这样的东西:

    var tags = (from i in iconTags["IconTags"] 
    where i["Key"].Value<string>() == "Com_Add" 
    select i["Tags"].Values<string>()).First();
    

    它将返回您获得的可枚举的第一个元素

    【讨论】:

      猜你喜欢
      • 2013-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多