首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >List<ComplexType>:需要对ComplexType的属性执行linq查询

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

Stack Overflow用户
提问于 2014-12-18 23:59:41
回答 2查看 522关注 0票数 0

举个例子,我有这样一个类型:

代码语言:javascript
复制
public class Stuff
{
    public Double StuffAmount;
    public String StuffDescription;
    public DateTime StuffDate;
}

我需要检查标准偏差和I've found those solutions elsewhere on stackoverflow。但要按照他们的提议行事,我需要这样做:

代码语言:javascript
复制
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,而这个类型已经有了双数作为属性吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-19 02:29:59

您可以执行以下操作之一

解决方案1

如前所述,您只需将Select转换为适当的类型,并将其传递给StandardDeviation方法。

给定的

代码语言:javascript
复制
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));
}

用法

代码语言:javascript
复制
List<Double> stuffAmounts = myListOfStuff.Select(s => s.StuffAmount).ToList()
double result = StandardDeviation(stuffAmounts);

解决方案2

或者,您可以创建一个扩展方法,并将标准的数学计算放在一个地方。

给定的

代码语言:javascript
复制
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));
   }
}

用法

代码语言:javascript
复制
var stuffs = new List<Stuff>();
var result = stuffs.StandardDeviation(x => x.StuffAmount);
票数 2
EN

Stack Overflow用户

发布于 2014-12-19 03:04:18

从你的问题中,我不能百分之百肯定这是你想要的,但在我看来,你想要的似乎只是不创建第二个列表,而要做到这一点,你只需要传递原始列表作为参数,并访问适当的属性。如下所示

给定的

代码语言:javascript
复制
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));
    }

用法

代码语言:javascript
复制
double stdDev = StandardDeviation(data)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27557837

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档