Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 林克问题_C#_Linq - Fatal编程技术网

C# 林克问题

C# 林克问题,c#,linq,C#,Linq,我有一个数据集,它有许多组 我必须计算两件事: 每个组中某些数据的平均值-我使用以下代码完成了此操作: var results = from res in dt.AsEnumerable() group res by res.Field<string>(key) into grp orderby Convert.ToInt32(grp.K

我有一个数据集,它有许多组

我必须计算两件事:

每个组中某些数据的平均值-我使用以下代码完成了此操作:

var results = from res in dt.AsEnumerable()
                      group res by res.Field<string>(key)
                          into grp
                          orderby Convert.ToInt32(grp.Key)
                          select new
                          {
                              date = grp.Key,
                              sum = grp.Average(r => Convert.ToDouble(r.Field<string>  (average)))

                          };
我还需要计算每个组的值的标准偏差,所以对于每个单独的组,我需要创建每个组的单个结果的数组或列表。我怎么能和LINQ一起做这件事

谢谢


编辑:我很欣赏我的问题,我的问题可能有点含糊;我知道如何计算标准偏差,我想知道如何提取上述各组的值列表,以便执行计算。谢谢。

这里有一个关于计算标准偏差的问题/答案:

对于项目列表,只需执行items=grp.ToList或grp.Selectc=>c.Field….ToList即可

达伦

只是一个快速的林克双关语!!要让您继续,直到得到更多答案:

希望这有帮助

[编辑]-基于上面的SO链接,您可以修改它并在静态类中尝试:

public static double StdDev(this IEnumerable<double> values)
{   
  double ret = 0;
  if (values.Count() > 0) 
  {      
     //Compute the Average      
     double avg = values.Average();
     //Perform the Sum of (value-avg)_2_2      
     double sum = values.Sum(d => Math.Pow(d - avg, 2));
     //Put it all together      
     ret = Math.Sqrt((sum) / (values.Count()-1));   
  }   
  return ret;
}
再加上一点覆盖,我已经准备好了,但在查看此链接时发生了变化:

然后简单地应用如下:

var results = from res in dt.AsEnumerable()
                  group res by res.Field<string>(key)
                      into grp
                      orderby Convert.ToInt32(grp.Key)
                      select new
                      {
                          date = grp.Key,
                          sum = grp.Average(r => Convert.ToDouble(r.Field<string>(average))),
                          stdDev =  gp.Select(s => Convert.ToDouble(s.Field<string>(average))).StdDev(),
                          // alternative override - note no need to convert
                          stdDev2 = gp.StdDev(s => s.Field<string>(average))
                      };

尚未测试,因此可能无法立即工作,但理论是存在的。

部分,谢谢,但我知道如何计算标准偏差,我真的需要知道如何根据上面的分组键从数据表中提取值列表。@Darren-grp包含每个分组键的行。从相关列中获取与平均值计算相同的值,并使用该值进行计算。例如grp.Selectc=>c.Field…谢谢,但我知道如何计算标准偏差,我真的需要知道如何根据Darren上方的分组键从datatable中提取值列表-如果您有足够的烟雾和镜像,上面的编辑可能会起作用:只需对匿名类型稍加调整即可。谢谢。如果您对stdDev=grp.Selectc=>Convert.ToDoublec.Fieldaverage.ToList.StandardDeviation感兴趣,这就是更改,很高兴这对您有用-很好。。。另外请注意,自从第一次尝试以来,我对扩展方法sig做了一些更改,因此如果您更改代码以匹配,希望您可以在不使用ToList的情况下调用。
public static double StdDev<T>(this IEnumerable<T> values, Func<T, double?> selector)
{
    double ret = 0;
    var count = values.Count();

    if (count > 0)
    {
        // Compute the Average
        double? avg = values.Average(selector);

        // Perform the Sum of (value-avg)^2
        double sum = values.Select(selector).Sum(d =>
        {
            if (d.HasValue)
            {
                return Math.Pow(d.Value - avg.Value, 2);
            }
            return 0.0;
        });

        // Put it all together
        ret = Math.Sqrt((sum) / (count - 1));
    }
    return ret;
}
var results = from res in dt.AsEnumerable()
                  group res by res.Field<string>(key)
                      into grp
                      orderby Convert.ToInt32(grp.Key)
                      select new
                      {
                          date = grp.Key,
                          sum = grp.Average(r => Convert.ToDouble(r.Field<string>(average))),
                          stdDev =  gp.Select(s => Convert.ToDouble(s.Field<string>(average))).StdDev(),
                          // alternative override - note no need to convert
                          stdDev2 = gp.StdDev(s => s.Field<string>(average))
                      };