如何反向枚举System.Text.Json.JsonElement数组?
如何反向枚举System.Text.Json.JsonElement数组?
嘿,这个问题我之前刚好碰到过,给你分享个既高效又贴合你需求的解决方案!
首先得说,JsonElement.EnumerateArray()确实只能正向遍历数组,但我们完全没必要把整个数组转成List再反转——因为JsonElement的数组支持按索引直接访问,而且这个操作是O(1)级别的,性能和正向枚举一样高效,完全不会有额外的内存开销。
你的核心痛点是:数组元素顺序和你需要的完全相反,又没法提前知道有多少元素符合条件,所以不能靠倒着给文件命名来绕开问题。那咱们换个思路:直接从数组的最后一个元素开始往前遍历,遇到符合条件的项就按顺序编号保存,完美匹配你的需求。
具体怎么改呢?看下面的代码:
public void ParseDataPoint(JsonElement result) { int i = 0; var data = result.GetProperty("data"); // 先拿到数组的总元素数量 int totalItems = data.GetArrayLength(); // 从最后一个索引开始,倒着遍历到第0个元素 for (int index = totalItems - 1; index >= 0; index--) { var item = data.GetArrayElementAtIndex(index); var subProperty = item.GetProperty("subProperty"); if (SubPropertyValueSatisfiesSpecificCondition(subProperty.GetString())) { File.WriteAllText($"{i}.json", item.ToString()); i++; } } }
这个方案的优势在哪?
- 性能拉满:不需要把整个数组转成集合再反转,
GetArrayElementAtIndex是直接访问底层数据,100个元素的场景下几乎没额外开销,比转List的方法高效得多 - 完美适配命名需求:倒着遍历原数组时,每找到一个符合条件的项就按
0、1、2...编号,完全不用提前知道符合条件的项有多少 - 改动极小:只是把原来的
foreach换成了倒序for循环,逻辑清晰,后续维护也方便
要是你还有其他关于System.Text.Json的细节问题,随时喊我!
内容来源于stack exchange
相关产品推荐
相关产品推荐

