创建托管.NET数组而不初始化为全零

时间:2010-01-24 02:52:59

标签: .net arrays

采用以下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所述的原因,无法完成。

1 个答案:

答案 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);
 }