2014-12-18 23 views
0

的屬性爲例LINQ查詢,我有一種類型是這樣的:列表<ComplexType>:需要做的的ComplexType

public class Stuff 
{ 
    public Double StuffAmount; 
    public String StuffDescription; 
    public DateTime StuffDate; 
} 

我需要檢查之類的標準偏差和I've found those solutions elsewhere on stackoverflow。但要做到這些他們所提議的方式,我需要做這樣的事情:

List<Double> stuffAmounts = new List<Double>(); 

foreach (var s in List<Stuff>) 
{ 
    stuffAmounts.Add(s.StuffAmount); 
} 

//now I have a list of doubles that I can do frequently referenced math functions with 

反正有做something like this,而不必進行新的名單,只是用我已經有複雜類型雙打作爲屬性?

+2

你可以'Select'可枚舉從'Stuff's可枚舉的相關性。特別是:'var stuffAmounts = myListOfStuff.Select(s => s.StuffAmount);' – 2014-12-19 00:02:13

+0

只需添加@Asad的有用評論,您也可以執行'List stuffAmounts = myListOfStuff.Select(s => s.StuffAmount)。 ToList();'爲了將值放入一個'List '(而不是'IEnumerable ',默認返回'.Select')。 – danludwig 2014-12-19 00:22:39

回答

2

你可以做一些下面

解決方案的1

正如所討論的,你可以只Select到合適的類型,並把它傳遞給你的StandardDeviation方法

鑑於

public static double StandardDeviation(List<double> valueList) 
{ 
    double M = 0.0; 
    double S = 0.0; 
    int k = 1; 
    foreach (double value in valueList) 
    { 
     double tmpM = M; 
     M += (value - tmpM)/k; 
     S += (value - tmpM) * (value - M); 
     k++; 
    } 
    return Math.Sqrt(S/(k-2)); 
} 

用法

List<Double> stuffAmounts = myListOfStuff.Select(s => s.StuffAmount).ToList() 
double result = StandardDeviation(stuffAmounts); 

解決方案2

或者你可以創建一個擴展方法,把你的標準的數學計算在一個地方

鑑於

public static class MathExtensions 
{ 
    public static double StandardDeviation<T>(this List<T> list, Func<T, Double> selector) where T : class 
    { 
     var m = 0.0; 
     var s = 0.0; 
     var k = 1; 
     foreach (var value in list.Select(selector)) 
     { 
     var tmpM = m; 
     m += (value - tmpM)/k; 
     s += (value - tmpM) * (value - m); 
     k++; 
     } 
     return Math.Sqrt(s/(k - 2)); 
    } 
} 

使用

var stuffs = new List<Stuff>(); 
var result = stuffs.StandardDeviation(x => x.StuffAmount); 
1

從你的問題我不是100%肯定這是你想要的,但在我看來,所有你想要的是不創建第二個列表,並做到這一點,你只需要傳遞原始列表作爲參數和在需要的地方訪問相應的屬性。像下面

東西鑑於

public static double StandardDeviation(List<Stuff> valueList) 
    { 
     double M = 0.0; 
     double S = 0.0; 
     int k = 1; 
     foreach (var value in valueList) 
     { 
      double tmpM = M; 
      M += (value.StuffAmount - tmpM)/k; 
      S += (value.StuffAmount - tmpM) * (value.StuffAmount - M); 
      k++; 
     } 
     return Math.Sqrt(S/(k - 2)); 
    } 

使用

double stdDev = StandardDeviation(data)