接受float []和double []数组的方法

Mic*_*hal 6 c# arrays

我有一个方法接受一个数组(浮点数或双精度数),开始和结束索引,然后对startIndex到endIndex范围内的索引进行一些元素操作.

基本上它看起来像这样:

public void Update(float[] arr, int startIndex, int endIndex)
{
   if (condition1)
   {
     //Do some array manipulation
   }
   else if (condition2)
   {
     //Do some array manipulation
   }
   else if (condition3)
   {
       if (subcondition1)
       {
         //Do some array manipulation
       }
   }
}
Run Code Online (Sandbox Code Playgroud)

方法比这长,并涉及将一些元素设置为0或1,或者规范化数组.问题是我需要在那里传递两个float[]double[]数组,并且不希望有一个重复的代码接受double[].

性能也很关键,因此我不想创建一个新double[]数组,向其投射浮点数组,执行计算,然后通过强制转换为浮点数来更新原始数组.

是否有任何解决方案可以避免重复的代码,但也尽可能快?

Qua*_*yst 2

使用泛型实现该方法怎么样?可以为您的核心业务逻辑创建一个抽象基类:

abstract class MyClass<T>
{
    public void Update(T[] arr, int startIndex, int endIndex)
    {
        if (condition1)
        {
            //Do some array manipulation, such as add operation:
            T addOperationResult = Add(arr[0], arr[1]);
        }
        else if (condition2)
        {
            //Do some array manipulation
        }
        else if (condition3)
        {
            if (subcondition1)
            {
                //Do some array manipulation
            }
        }
    }

    protected abstract T Add(T x, T y);
}
Run Code Online (Sandbox Code Playgroud)

然后为每个数据类型实现一个调整为特定于类型的操作的继承类:

class FloatClass : MyClass<float>
{
    protected override float Add(float x, float y)
    {
        return x + y;
    }
}

class DoubleClass : MyClass<double>
{
    protected override double Add(double x, double y)
    {
        return x + y;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 不适用于 arr[0] = arr[1]+arr[2] 和类似的情况。我希望我可以写 `Update&lt;T&gt;(...) where T: INumeric` 或类似的内容 (3认同)