Как реализовать "функцию", которая будет выполняться на массиве в C # - PullRequest
4 голосов
/ 19 июля 2010

Исходя из не-OO фона в 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 голосов
/ 19 июля 2010

Вы можете просто представить массив как IEnumerable , а затем использовать любой метод LINQ , например Среднее :

MyClass myObject = ...

double a = myObject.Data.Average();

, где

class MyClass
{
    private int[] data;

    public IEnumerable<int> Data
    {
        get
        {
            return this.data;
        }
    }
}
2 голосов
/ 19 июля 2010

Я настоятельно рекомендую взять эту книгу от Дидье Бессета о создании объектно-ориентированных численных методов.Концепции были очень полезны для меня на протяжении многих лет.Несмотря на то, что примеры написаны на Java, код легко переносится на C #.

-Scott

2 голосов
/ 19 июля 2010

Преимущество вашего первого варианта (выполнение работы внутри MyClass) заключается в том, что вы не раскрываете внутреннюю работу класса его клиентам.Допустим, в какой-то момент в будущем вы решите изменить коллекцию с массива на общий список.Сохранение обработки внутри класса означает, что вам не нужно будет искать и менять другие классы, которые тесно связаны с реализацией MyClass (например, OperatorClass)

1 голос
/ 19 июля 2010

Вы можете написать методы расширения , чтобы выполнить необходимую обработку. Это приведет к тому, что обработка будет отличаться от данных класса, и, если ваша иерархия объектов это позволяет, это также позволит позже использовать те же методы в других классах. Обратите внимание, что если вы пойдете по этому пути, вам нужно будет публично предоставить достаточно информации для работы методов расширения (поскольку они не являются частью класса, они не могут получить доступ к private или protected членам).

...