C# 为什么我不能从JArray中删除元素?

C# 为什么我不能从JArray中删除元素?,c#,json,json.net,C#,Json,Json.net,我从HTTP流中获取json对象。我使用以下命令创建JObject: var stream = await client.GetStreamAsync(uri); var root = JToken.Load(new JsonTextReader(new StreamReader(stream))); 这给了我恰当的回答。但是现在,我想删除其results属性的最后一个元素,即数组JArray。我使用以下代码: var results = (JArray)root["results"]; va

我从HTTP流中获取json对象。我使用以下命令创建JObject:

var stream = await client.GetStreamAsync(uri);
var root = JToken.Load(new JsonTextReader(new StreamReader(stream)));
这给了我恰当的回答。但是现在,我想删除其results属性的最后一个元素,即数组JArray。我使用以下代码:

var results = (JArray)root["results"];
var last = results.Last();              // gets the last element -- correct
var removed = results.Remove(last);     // removed = false and last not removed
var another = last.Remove();            // doesn't work either
我能够使用以下方法从根对象本身删除机密属性:

var removed = ((JObject)root).Remove("secret"); // removed = true, works
我还可以将元素添加到结果数组中,但由于某些原因,我无法删除它们。我错过了什么

编辑:在我的头撞在墙上几个小时并写了这篇文章之后,我发现了发生了什么。上面的代码是我实际代码的简化版本。事实上,正是这种简化才是答案。原始代码略为简化:

关键是我被错误地称为ToObject。这很可能破坏了删除逻辑,因为新对象与原始JArray不同。
因此,发布的代码工作正常,我已经更新了我的代码,使其更简单。对不起,这里太吵了。为了清晰起见,这里是重新发布的完美例证:

在我的头撞在墙上几个小时并写了这篇文章之后,我发现了发生了什么。上面的代码是我实际代码的简化版本。事实上,正是这种简化才是答案。原始代码略为简化:

关键是我给ToObject打错电话了。这很可能破坏了删除逻辑,因为新对象与原始JArray不同。因此,发布的代码工作正常,我已经更新了我的代码,使其更简单。对不起,这里太吵了。一个完美的例子
感谢James N-K在Twitter上的快速响应和他伟大的图书馆。感谢他给了杰夫·阿特伍德(Jeff Atwood)这样的人。

为了清晰起见,请在这里重新发布:

在我的头撞在墙上几个小时并写了这篇文章之后,我发现了发生了什么。上面的代码是我实际代码的简化版本。事实上,正是这种简化才是答案。原始代码略为简化:

关键是我给ToObject打错电话了。这很可能破坏了删除逻辑,因为新对象与原始JArray不同。因此,发布的代码工作正常,我已经更新了我的代码,使其更简单。对不起,这里太吵了。一个完美的例子
感谢James N-K在Twitter上的快速响应和他伟大的图书馆。感谢他给了Jeff Atwood这样的人。

您可以使用此函数从JArray中删除任何obj或字符串/int/boolean。。。 此函数采用两个参数: 1个JArray,您要从中删除任何内容。 2要从JArray中删除的动态JObject或字符串、整数或布尔变量。 此函数将返回更新的JArray

private static JArray RemoveValue(JArray oldArray, dynamic obj)
{
    List<string> newArray= oldArray.ToObject<List<string>>();
    newArray.Remove(obj); 
    return JArray.FromObject(newArray);
}

您可以使用此函数从JArray中删除任何obj或字符串/int/boolean。。。 此函数采用两个参数: 1个JArray,您要从中删除任何内容。 2要从JArray中删除的动态JObject或字符串、整数或布尔变量。 此函数将返回更新的JArray

private static JArray RemoveValue(JArray oldArray, dynamic obj)
{
    List<string> newArray= oldArray.ToObject<List<string>>();
    newArray.Remove(obj); 
    return JArray.FromObject(newArray);
}

你应该在答案中加上正确的一行,而不是错误的一行。但还是投了赞成票。真的@slayernoah?你能停止追逐名誉点,真正地阅读答案吗?发布的代码作为expected@EricLiprandi我不知道添加评论与声誉点有什么关系。你知道这是怎么回事吗?只是遇到了你的问题和答案,我没有看到正确的答案代码away@slayernoah,我的错。我想英语不像我一样是你的母语。但你的评论语气虽然简短,但非常直接,有点居高临下。这几乎意味着你忘记添加更新的代码,所以去添加吧。我非常注意我问题的格式和措辞,当有人批评我的演讲时,我会很快发火,但欢迎对内容的反馈。。。。给我上的一课。@EricLiprandi哦,对不起,这根本不是要让它屈尊俯就。我正忙着把事情做完,而且有点匆忙。我非常感谢您发布答案=您应该在答案中添加正确的行,而不是错误的行。但还是投了赞成票。真的@slayernoah?你能停止追逐名誉点,真正地阅读答案吗?发布的代码作为expected@EricLiprandi我不知道添加评论与声誉点有什么关系。你知道这是怎么回事吗?只是遇到了你的问题和答案,我没有看到正确的答案代码away@slayernoah,我的错。我想英语不像我一样是你的母语。但你的评论语气虽然简短,但非常直接,有点居高临下。这几乎意味着你忘记添加更新的代码,所以去添加吧。我非常注意我问题的格式和措辞,当有人批评我的演讲时,我会很快生气,但我欢迎
对内容的反馈。。。。给我上的一课。@EricLiprandi哦,对不起,这根本不是要让它屈尊俯就。我正忙着把事情做完,而且有点匆忙。我非常感谢你发布答案=请解释你的代码,不要只是发布代码并期望人们理解。欢迎来到StackOverflow。只有代码的答案往往会被标记为删除,因为它们的质量很低。请阅读回答问题的帮助部分,然后考虑对你的答案添加一些评论。请解释你的代码,不要只是发布代码,并期望人们理解它。欢迎到StAdvOp溢出。只有代码的答案往往会被标记为删除,因为它们的质量很低。请阅读回答问题的帮助部分,然后考虑给你的答案添加一些评论。
private static JArray RemoveValue(JArray oldArray, dynamic obj)
{
    List<string> newArray= oldArray.ToObject<List<string>>();
    newArray.Remove(obj); 
    return JArray.FromObject(newArray);
}