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

无论如何,是否可以在不制作新列表的情况下做这样的事情,只需使用已经将双精度作为属性的复杂类型?

List<ComplexType> :需要对 ComplexType 的属性执行 linq 查询

您可以执行以下一些操作

解决方案 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)