List :需要对 ComplexType 的属性执行 linq 查询
本文关键字:ComplexType 属性 执行 linq 查询 List | 更新日期: 2023-09-27 18:34:37
例如,我有一个这样的类型:
public class Stuff
{
public Double StuffAmount;
public String StuffDescription;
public DateTime StuffDate;
}
我需要检查标准偏差之类的东西,我已经在堆栈溢出的其他地方找到了这些解决方案。但是要按照他们被提议的方式做它们,我需要做这样的事情:
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
无论如何,是否可以在不制作新列表的情况下做这样的事情,只需使用已经将双精度作为属性的复杂类型?
您可以执行以下一些操作
解决方案 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);
从您的问题来看,我不能 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)