如何在C#中实现对数组执行“函数”的操作

4

我之前使用Matlab,没有面向对象编程的背景,现在想要以最佳实践的方式在C#中执行一些我习惯的操作。

我有一个类,它从数据源导入数据,并将其格式化为包括整数数组在内的其他内容。我将要对这个数组执行一些操作。为了简单起见,假设我想计算所有值的平均值。我认为,我有三个选择:

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

  • 显然有一种方式可以继承或接口,以创建一个专门执行此类操作的类,我将能够通过实例化这个新类并传递数组来访问它:

OperatorClass oc = new OperatorClass();

oc.data=MyClass.MyArray;

double arrayAverage = oc.ArrayAverage();

扩展类似乎有风险,因为它还负责导入和格式化数据。如果我也将所有数据处理添加到其中,它可能会变得非常庞大,并且其他人很难与我一起添加和处理。

未来的代码将需要对数组执行更复杂的操作,而我目前不知道它们会是什么。我将在未来的程序中使用一些基本操作,这将作为静态类的一部分非常有用,但是复杂的操作则会变得多余。

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

如果您对此有想法,我会感激您的意见!

4个回答

7
您可以将数组简单地暴露为IEnumerable<int>,然后使用任何LINQ方法,比如Average
MyClass myObject = ...

double a = myObject.Data.Average();

在哪里

class MyClass
{
    private int[] data;

    public IEnumerable<int> Data
    {
        get
        {
            return this.data;
        }
    }
}

1
此外,任何不直接受 LINQ 支持的未来操作都可以使用扩展方法轻松实现,并以类似于 LINQ 的方式使用。例如,double funkyResult = myObject.MyArray.FunkyFunction() 等。 - LukeH
有趣...虽然我将添加其他特定情况的方法,但我能通过扩展LINQ方法来包含它们吗?还是我应该将它们添加到主MyClass中? - zotty
啊哈!使用扩展方法似乎是一个有趣的选择。现在正在阅读相关内容... - zotty
2
虽然在许多应用程序中很可爱,但我不建议围绕LINQ设计科学计算库。 可爱与性能之比会迅速缩小。 - Scott P
这听起来是正确的方式...谢谢大家,非常感谢。 - zotty

2
你在第一种选择(在MyClass内完成工作)中的一个好处是,你不会向类的客户端公开其内部运作方式。假设在未来的某个时候,你决定需要将集合从数组更改为通用列表。将处理保持在类的内部意味着你不需要四处寻找并更改对MyClass如何实现有紧密依赖关系的其他类(例如OperatorClass)。

好观点,但在当前情况下,我不可能想要改成列表...(著名的遗言..!) - zotty

2
我强烈推荐阅读Didier Besset的这本书,其中介绍了创建面向对象数值方法的内容。多年来,这些概念对我非常有帮助。尽管示例是用Java编写的,但代码很容易转换为C#。

-Scott


谢谢,我会看一下的。 - zotty

1
你可以编写扩展方法来执行所需的处理。这将把处理放在与数据不同的类中,如果您的对象层次结构允许,还可以允许稍后在其他类上使用相同的方法。请注意,如果您选择这条路线,您需要公开提供足够的信息以使扩展方法工作(因为它们不是类的一部分,无法访问privateprotected成员)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接