如何获取C#中三重嵌套数组内指定元素的索引?
获取三重嵌套List中指定元素的索引
你有一个从JSON反序列化得到的三重嵌套数组:
"Maps": [[[115.09049366110303, 116.30256509622684, 116.58246833041298]], [[25.0, 24.0, 58.0]]]
目前使用foreach循环遍历该数组的代码如下:
public class Root { public List<List<List<double>>> Maps { get; set; } } // Start is called before the first frame update void Start() { Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(textJson.text); foreach (var item in myDeserializedClass.Maps) { foreach (var x in item) { foreach (var y in x) { ... } } } }
需要获取指定元素(例如25.0)的三层索引,以便后续使用。以下是几种可行的解决方案:
方法1:用for循环替代foreach
直接使用三层for循环,天然获取每一层的索引,找到目标值时记录对应索引:
void Start() { Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(textJson.text); double target = 25.0; int outerIndex = -1, middleIndex = -1, innerIndex = -1; for (int i = 0; i < myDeserializedClass.Maps.Count; i++) { var middleList = myDeserializedClass.Maps[i]; for (int j = 0; j < middleList.Count; j++) { var innerList = middleList[j]; for (int k = 0; k < innerList.Count; k++) { // 浮点数注意精度,不确定场景用Math.Abs(innerList[k] - target) < 1e-9 if (innerList[k] == target) { outerIndex = i; middleIndex = j; innerIndex = k; // 找到目标后直接跳出所有循环 goto ExitLoop; } } } } ExitLoop: if (outerIndex != -1) { // 使用索引获取元素或做后续处理 var foundValue = myDeserializedClass.Maps[outerIndex][middleIndex][innerIndex]; } }
方法2:foreach中手动维护索引
如果不想替换foreach,可以在每层循环外声明索引变量,循环时自增并记录目标索引:
void Start() { Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(textJson.text); double target = 25.0; int outerIndex = -1, middleIndex = -1, innerIndex = -1; int currentOuter = 0; foreach (var middleList in myDeserializedClass.Maps) { int currentMiddle = 0; foreach (var innerList in middleList) { int currentInner = 0; foreach (var value in innerList) { if (value == target) { outerIndex = currentOuter; middleIndex = currentMiddle; innerIndex = currentInner; goto ExitLoop; } currentInner++; } currentMiddle++; } currentOuter++; } ExitLoop: if (outerIndex != -1) { // 后续索引使用逻辑 } }
方法3:使用LINQ查询索引
通过LINQ的索引重载方法,一次性查询出目标元素的三层索引:
void Start() { Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(textJson.text); double target = 25.0; var result = myDeserializedClass.Maps .Select((middleList, outerIdx) => new { OuterIndex = outerIdx, MiddleItems = middleList.Select((innerList, middleIdx) => new { MiddleIndex = middleIdx, InnerItems = innerList.Select((val, innerIdx) => new { InnerIndex = innerIdx, Value = val }) }) }) .SelectMany(outer => outer.MiddleItems.SelectMany(middle => middle.InnerItems .Where(item => item.Value == target) // 精度问题需调整时替换为Math.Abs比较 .Select(item => new { OuterIndex = outer.OuterIndex, MiddleIndex = middle.MiddleIndex, InnerIndex = item.InnerIndex, item.Value }))) .FirstOrDefault(); if (result != null) { // 获取到索引:result.OuterIndex, result.MiddleIndex, result.InnerIndex var foundValue = myDeserializedClass.Maps[result.OuterIndex][result.MiddleIndex][result.InnerIndex]; } }
内容的提问来源于stack exchange,提问作者Katakan
相关产品推荐
相关产品推荐

