作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试能够遍历锯齿状数组,但数组深度不是恒定的。我正在寻找一种干净的方法来遍历数组中的每个对象。现在我有一个简单的 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/
我是一名优秀的程序员,十分优秀!