2013-05-28 24 views
3

我有一個double[]和我有另一個IEnumerable<double>和另一個List<double>ObservableCollection<double>按比例收集的價值

所有這些都包含一些雙重價值。

我想創建可採取任何的這些,因爲這些集合作爲arguements的函數,並且它會成比例集合中的每個元素的值,使得它們添加到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(....)函數?

+0

MZF的答案是一個很好的解決方案,以 「適度」 的列表。您現在可以創建採用不同類型集合的方法的重載。在這些方法中,你把元素一個新的列表,並調用它接受一個列表,並返回一個列表proportionated,反過來你放回原來的收集方法。 –

回答

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; 
     } 
    } 

編輯:做小的變化 - 變化ListIList作爲@Rawling建議

+1

而不是增加我自己的答案,我會建議您更改'List'到'IList'參數,因爲那麼這將爲所有除了'IEnumerable'的問題的類型的工作(這行不通無論如何)。此外,你從'Count()'中刪除'()'。 – Rawling

+0

還有一個問題....你如何爲雙打通過'params'做到這一點? –

+0

你是什麼意思'通過參數'?你能展示API嗎? – Mzf