【问题标题】:List<ComplexType> : need to do a linq query on a property of the ComplexTypeList<ComplexType> :需要对 ComplexType 的属性进行 linq 查询
【发布时间】:2014-12-18 23:59:41
【问题描述】:

例如,我有一个这样的类型:

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 而不必创建一个新列表,只需使用我已经具有双打作为属性的复杂类型?

【问题讨论】:

  • 您可以从Stuffs 的可枚举中Select 相关属性的可枚举。具体来说:var stuffAmounts = myListOfStuff.Select(s =&gt; s.StuffAmount);
  • 只是为了添加到@Asad 的有用评论,您还可以执行List&lt;Double&gt; stuffAmounts = myListOfStuff.Select(s =&gt; s.StuffAmount).ToList(); 以将值放入List&lt;Double&gt;(而不是IEnumerable&lt;Double&gt;.Select 返回默认)。

标签: c# linq math


【解决方案1】:

您可以执行以下操作

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

【讨论】:

    【解决方案2】:

    根据您的问题,我不能 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-17
      • 1970-01-01
      • 2013-09-09
      • 1970-01-01
      • 2016-10-10
      • 2012-06-06
      相关资源
      最近更新 更多