Ограничения универсального типа в C # - PullRequest
2 голосов
/ 11 августа 2011

Я никогда не использовал дженерики раньше, и мне было интересно, как ограничить тип либо Double[], либо List<Double> (или даже это правильная вещь). Мне нужно вычислить среднее для многих чисел, которые иногда известны заранее (то есть я могу создать массив точного размера), но в другое время они генерируются непосредственно перед вычислением (то есть я использую список).

Мне бы хотелось, чтобы этот универсальный метод Average(T arrayOrList) мог принимать массив или список вместо перегрузки метода Average().

Спасибо!

Ответы [ 4 ]

6 голосов
/ 11 августа 2011

Я бы просто использовал IEnumerable<double>, поскольку все, что вам нужно сделать, - это циклически перебирать данные (и списки, и массивы поддерживают это, как и отложенные последовательности).

Фактически, Microsoft добралась там первой:

var avg = sequence.Average();

http://msdn.microsoft.com/en-us/library/bb358946.aspx

6 голосов
/ 11 августа 2011

Поскольку и double[], и List<double> реализуют IEnumerable<double>, я бы предложил следующее:

public double Average(IEnumerable<double> arrayOrList) {
    // use foreach to loop through arrayOrList and calculate the average
}

Это простой полиморфизм подтипов, не требуются никакие дженерики.уже упоминалось, если вы просто хотите вычислить среднее значение, такой метод уже существует в рамках .

2 голосов
/ 11 августа 2011

Почему бы просто не написать функцию, которая принимает IEnumerable<double>?

Тогда, если вы действительно хотите использовать ArrayList, я предполагаю, что не по выбору вы можете использовать расширения AsEnumerable().

РЕДАКТИРОВАТЬ, кажется, я Miread ArrayOrList, но ответ по-прежнему применяется, хотя это было на 56 секунд позже

0 голосов
/ 11 августа 2011

var x = new List ();var среднее = x.Average ();var y = new Double [10];среднее значение = y.Average ();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...