按比例调整集合的值

3
我有一个 double[],还有一个 IEnumerable<double>,以及一个 List<double> 和一个 ObservableCollection<double>,他们都包含一些 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(....)函数吗?


Mzf的答案是“按比例”列出列表的好解决方案。现在,您可以创建重载该方法的不同类型集合。在这些方法中,您将元素放入新列表中,并调用接受列表并返回按比例排列的列表的方法,然后将其放回原始集合中。 - John Willemse
1个回答

4
你可以这样做。
    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;
        }
    }

更新: 做了小修改 - 根据@Rawling的建议将 List 更改为 IList


1
与其添加我的答案,我建议您将参数从“List”更改为“IList”,因为这样将适用于问题中的所有类型,除了“IEnumerable”(无论如何都不起作用)。另外,您可以省略Count()中的括号。 - Rawling
你说的“passed as params”是什么意思?能展示一下API吗? - Mzf

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