gpt4 book ai didi

c# - 遍历 n 维 Jagged Array

转载 作者:行者123 更新时间:2023-11-30 19:48:52 28 4
gpt4 key购买 nike

我正在尝试能够遍历锯齿状数组,但数组深度不是恒定的。我正在寻找一种干净的方法来遍历数组中的每个对象。现在我有一个简单的 switch case,它可以通过将其 Rank 作为 case 的 int 来处理不同的级别。

但有时数组有 2 层深,有时有 5 层深。我不想为每个深度级别都写一个案例。

例如,我有一个名为 myObj 的对象,有时它是 myObj[] 或 myObj[][] 或 myObj[][][][];

使用foreach或IEnumerator只遍历数组的第一维

最佳答案

这是一个遍历锯齿状/多维数组的扩展方法(类似于 David B.one 的,但具有 yield、null 处理和类型转换):

public static class Extensions
{
public static IEnumerable<T> Traverse<T>(this Array array)
{
foreach (object val in array)
{
if (val == null)
continue; //null means empty sub-array --> skip it
if (val is Array)
{
var subArray = (Array)val;
foreach (var value in subArray.Traverse<T>())
yield return value;
}
else
{
yield return (T)val;
}
}
}
}

使用示例:

class Program
{
static void Main(string[] args)
{
int[][][] jagged = new int[4][][];

jagged[0] = new int[2][] { new[] { 0, 1 }, new[] { 2, 3, 4 } };
jagged[1] = new int[3][] { new[] { 5, 6, 7 }, new[] { 8, 9, 10 }, new[] { 11, 12 } };
jagged[3] = new int[4][] { new[] { 13, 14 }, null, new[] { 15, }, new[] { 16 } };

var jaggedElements = jagged.Traverse<int>().ToList();
// contains: 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16

int[, ,] multi = new[, ,] { { { 1, 2 }, { 3, 4 } },
{ { 4, 5 }, { 6, 7 } },
{ { 8, 9 }, { 10, 11 } } };


var multiElements = multi.Traverse<int>().ToList();
// contains: 1,2,3,4,5,6,7,8,9,10,11

}
}

关于c# - 遍历 n 维 Jagged Array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4888070/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com