C# 如何以更简化的方式从锯齿状数组返回数据?

C# 如何以更简化的方式从锯齿状数组返回数据?,c#,C#,我创建了一个factory类,它允许用户调用方法Generate,并通过一些我通常不希望用户处理的逻辑填充一个锯齿数组 由于工厂生成的网格布局的类型,很多索引都是空的 但是我不希望用户必须迭代数组索引并检查null。是否有任何方法可以简化这个过程,让用户无需担心就可以迭代这个数组 例如,要迭代他们当前必须执行的数据: for (int i = Map.MapData.Length - 1; i >= 0; --i) { for (int j = Map.MapData[i].Len

我创建了一个factory类,它允许用户调用方法
Generate
,并通过一些我通常不希望用户处理的逻辑填充一个锯齿数组

由于工厂生成的网格布局的类型,很多索引都是空的

但是我不希望用户必须迭代数组索引并检查null。是否有任何方法可以简化这个过程,让用户无需担心就可以迭代这个数组

例如,要迭代他们当前必须执行的数据:

for (int i = Map.MapData.Length - 1; i >= 0; --i)
{
    for (int j = Map.MapData[i].Length - 1; j >= 0; --j)
    {
         // would rather they didn't have to check for null
         if (Map.MapData[i][j] == null) continue;

         // do stuff with data
    }
}
这并不是所有的用户友好。有没有一种方法可以让数据对用户更加线性化,比如在数据上使用for-each?我不完全确定我在寻找什么来实现这一目标,希望有人能为我指明正确的方向


谢谢

如果您只想循环数组元素并放弃索引,可以使用扩展方法:

public static class JaggedArrayExtensions {
    public static IEnumerable<T> IterateNonNull<T>(this T[][] array) where T : class {
        for (int i = array.Length - 1; i >= 0; --i)
        {
            for (int j = array[i].Length - 1; j >= 0; --j)
            {
                // would rather they didn't have to check for null
                if (array[i][j] == null) continue;

                yield return array[i][j];
            }
        }
    }
}
如果这是您第一次看到
yield return
,请阅读。

在查询集合时(在您的情况下,您希望所有的
null
项),请尝试使用Linq:


用户是否需要数组索引?只遍历非null元素(比如foreach循环)可以吗?跳过null会更好,因为这样他们就不必担心null了。把它转换成list list=jaggedArray.SelectMany(t=>t.ToList();使用它检查null,并使用单个for循环。对于两个for循环,您的情况下的时间复杂度可能是O(n^2)哦,很好,所以您就是这样做的。这在微软的网站上很难找到。感谢代码示例:)@WDUK如果这是您第一次看到
yield
,此链接可能会有所帮助:例如,我将yield用于协同程序。只是不知道如何使用锯齿状数组作为for-each。下面是一个问题,是否可以不调用方法就这样做,所以它是自动的?我见过一些没有数据的for-each循环,它只有数据。如果不指定或什么,它是否使用默认值?@WDUK这些都是可能的,因为正在循环的对象实现了
IEnumerable
。锯齿数组可能也实现了这一点,因此可以说
foreach(jaggedArray中的var项)
,但这并不跳过空值。
foreach (var item in jaggedArray.IterateNonNull()) {
    // ...
}
  var NotNullItems = Map
    .SelectMany(line => line      // From each line
       .Where(x => x != null));   // Filter out all null items

  foreach (var item in NotNullItems) {
    // do stuff with data
  }