举个例子,我有这样一个类型:
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,而这个类型已经有了双数作为属性吗?
发布于 2014-12-19 02:29:59
您可以执行以下操作之一
解决方案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);发布于 2014-12-19 03:04:18
从你的问题中,我不能百分之百肯定这是你想要的,但在我看来,你想要的似乎只是不创建第二个列表,而要做到这一点,你只需要传递原始列表作为参数,并访问适当的属性。如下所示
给定的
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)https://stackoverflow.com/questions/27557837
复制相似问题