采用以下C#方法:
static double[] AddArrays(double[] left, double[] right)
{
if (left.Length != right.Length) {
throw new ArgumentException("Arrays to add are not the same length");
}
double[] result = new double[left.Length];
for (int i = 0; i < left.Length; i++) {
result[i] = left[i] + right[i];
}
return result;
}
据我了解,CLR会将result
初始化为全零,即使AddArrays
即将完全初始化它。有没有办法避免这项额外的工作?即使这意味着使用不安全的C#,C ++ / CLI或原始IL代码?
编辑:由于here所述的原因,无法完成。
答案 0 :(得分:3)
你应该这样做:
static IEnumerable<double> Add(IEnumerable<double> left, IEnumerable<double> right)
{
using (IEnumerator<double> l = left.GetEnumerator())
using (IEnumerator<double> r = right.GetEnumerator())
{
while (l.MoveNext() && r.MoveNext())
{
yield return l.Current + r.Current;
}
if (l.MoveNext() || r.MoveNext())
throw new ArgumentException("Sequences to add are not the same length");
}
}
您可以将双数组传递给此函数。如果你真的需要一个数组作为结果(提示:你可能不这样做),你可以在函数的返回值上调用.ToArray()
。
.Net 4将内置一个功能:
double[] array1 = {1.0, 2.0, 3.0};
double[] array2 = {4.0, 5.0, 6.0};
IEnumerable<double> result = array1.Zip(array2, (a,b) => a + b);
foreach(double d in result)
{
Console.WriteLine(d);
}