У меня есть double[], еще один IEnumerable<double>, еще один List<double>, а также ObservableCollection<double>.

Все они содержат несколько двойных значений.

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

Например, - если в массиве есть 0,5, 1,0 и 0,5, то я могу вызвать ProportionateIt(mycollection), он должен изменить значения на 0,25, 0,5 и 0,25, потому что теперь они в сумме равны 1.

Пока я пробовал это:

    private IEnumerable<double> ProportionateIt(IEnumerable<double> input)
    {
        double sum = 0;
        var newCollection = input.ToList();
        foreach (double d in newCollection)
        {
            sum+= d;
        }

        for (int i=0; i < input.Count(); i++)
        {
            newCollection[i] = newCollection[i]*(1/sum);
        }

        input = newCollection as IEnumerable<double>;
        return input;
    }

Есть некоторые проблемы

  • Он не принимает в качестве аргументов все указанные выше типы.
  • он возвращает новую коллекцию вместо изменения исходной.

Может ли кто-нибудь создать для меня функцию ProportionateIt (....)?

3
Joe Slater 28 Май 2013 в 14:44
Ответ MZF - хорошее решение для «пропорционального» списка. Теперь вы можете создавать перегрузки метода, которые принимают разные типы коллекций. В этих методах вы помещаете элементы в новый список и вызываете метод, который принимает список и возвращает пропорциональный список, который, в свою очередь, вы возвращаете в исходную коллекцию.
 – 
John Willemse
28 Май 2013 в 15:00

1 ответ

Лучший ответ

Ты можешь это сделать

    private static void ProportionateIt(IList<double> input)
    {
        double sum = input.Sum(d => d);

        for (int i = 0; i < input.Count; i++)
        {
            input[i] = input[i] / sum;
        }
    }

Изменить: внес небольшие изменения - измените List на IList, как предлагает @Rawling

4
Mzf 28 Май 2013 в 15:04
1
Вместо того, чтобы добавлять свой ответ, я предлагаю вам изменить параметр с List на IList, потому что тогда это будет работать для всех типов в вопросе, кроме IEnumerable (который все равно никогда не сработает). Кроме того, вы сбросите () с Count().
 – 
Rawling
28 Май 2013 в 15:01
Что ты имеешь в виду passed as params? не могли бы вы показать API?
 – 
Mzf
28 Май 2013 в 21:11