Mel*_*sus 1 .net c# arrays .net-3.5
假设我有这个功能:
void int Calculate(double[] array) {}
Run Code Online (Sandbox Code Playgroud)
在我的主要部分,我得到了这个数组:
double[,] myArray = new double[3,3];
Run Code Online (Sandbox Code Playgroud)
我该如何调用Calculate(...)?
我试试(那不编译):
double[] mySingleArray = myArray[0];
Run Code Online (Sandbox Code Playgroud)
我想避免的是不必要的循环(for).
我声明了一个常规数组,但如果一个锯齿状数组或任何其他类型的数组效果更好,那对我来说没问题.
我使用c#3.5
首先,让我们像这样声明你的Calculate()方法:
int Calculate(IEnumerable<double> doubles)
Run Code Online (Sandbox Code Playgroud)
别担心,您仍然可以将数组传递给该代码.你可能也需要IList<double>,但是10个中有9个IEnumerable足够好了.主要的是,这将让我们使用yield关键字以有效的方式切割您的数组:
public static IEnumerable<T> Slice(this T[,] values)
{
return Slice(values, 0, 0);
}
public static IEnumerable<T> Slice(this T[,] values, int index)
{
return Slice(values, 0, index);
}
public static IEnumerable<T> Slice(this T[,] values, int dimension, int index)
{
int length = values.GetUpperBound(dimension);
int[] point = new int[values.Rank];
point[dimension] = index;
dimension = 1 - dimension;// only works for rank == 2
for (int i = 0; i < length; i++)
{
point[dimension] = i;
yield return (T)values.GetValue(point);
}
}
Run Code Online (Sandbox Code Playgroud)
它仍然需要一些工作,因为它只适用于2级数组,但对于您发布的示例应该没问题.
现在你可以像这样调用你的计算函数:
Calculate(myArray.Slice(0));
Run Code Online (Sandbox Code Playgroud)
请注意,由于IEnumerable和yield语句的工作方式,我发布的代码中的for循环基本上是免费的.它直到您实际迭代Calculate方法中的项目才会运行,甚至以"即时"方式运行,以便整个算法保持为O(n).
当您分享您的Calculate方法正在执行的操作时,它会变得更加有趣.您可以将其表达为简单的Aggregate + lambda表达式.例如,假设您的calculate方法返回的项目数> 5:
myArray.Slice(0).Count(x => x > 5);
Run Code Online (Sandbox Code Playgroud)
或者说它总结了所有项目:
myArray.Slice().Sum();
Run Code Online (Sandbox Code Playgroud)