You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 13:01:07