如何在C#中实现对数组执行的"函数"

zot*_*tty 4 c# oop function static-libraries

来自Matlab中的非OO背景,我正在寻求以最佳实践方式执行我习惯的一些操作来进行C#.

我有一个类,它从一个源中导入数据,并将其格式化为一个int数组.我想要对这个数组执行一些操作.为了简单起见,我想说我想取所有值的平均值.我看到它的方式,我有三个选择:

  • 该数组是MyClass的一部分,因此我可以扩展MyClass以返回MyArray的平均值.double arrayAverage=MyClass.ArrayAve;
  • 我可以开发一个静态类,让我可以访问平均值 double arrayAverage= zotty.arrayMath.average(MyArray);

  • 显然我可以通过某种方式继承或接口,以便我创建一个专门用于执行此类操作的类,然后Id可以通过实例化这个新类并将其传递给数组来访问:

OperatorClass oc = new OperatorClass();

oc.data = MyClass.MyArray;

double arrayAverage = oc.ArrayAverage();

扩展类似乎有风险,因为它还负责导入和格式化数据.如果我将所有数据处理添加到它中,我可能变得非常大,并且对于其他人来说,添加和与我一起工作并不是直截了当的.

未来的代码将需要在阵列上进行更复杂的操作,我不知道它们目前会是什么.我将在未来的程序中使用一些基本操作,这些操作作为静态类的一部分很有用 - 但复杂的操作将是多余的.

用于执行数据处理的单独类允许导入/格式化类保持隔离.它可以提供一般功能和特定功能,但代价是在代码中实例化另一个变量,这在我看来有点凌乱.

如果你对此事有任何想法,我会感激一些意见!

dtb*_*dtb 7

您可以简单地将数组公开为IEnumerable <int>,然后使用任何LINQ方法,例如Average:

MyClass myObject = ...

double a = myObject.Data.Average();
Run Code Online (Sandbox Code Playgroud)

哪里

class MyClass
{
    private int[] data;

    public IEnumerable<int> Data
    {
        get
        {
            return this.data;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 虽然很多应用程序很可爱,但我不建议围绕LINQ设计用于科学计算的库.可爱与性能比将迅速缩小. (2认同)