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