对如何在LINQ to Objects中实现扩展方法感到困惑

时间:2009-09-22 12:59:58

标签: c# linq linq-to-objects

LINQ相当新,并尝试围绕扩展方法。我正在尝试做什么:

1)有一个包含三列的表,col1(string),col2(double),col3(DateTime)

        table1.Rows.Add("string 1", 1, new DateTime(2009, 01, 01));
        table1.Rows.Add("string 1", 2, new DateTime(2009, 02, 01));
        table1.Rows.Add("string 1",3, new DateTime(2009, 03, 01));
        table1.Rows.Add("string 1", 4, new DateTime(2009, 04, 01));
        table1.Rows.Add("string 2",1, new DateTime(2009, 05, 01));
        table1.Rows.Add("string 2", 1, new DateTime(2009, 06, 01));
        table1.Rows.Add("string 2", 5, new DateTime(2009, 07, 01));
        table1.Rows.Add("string 3", 6, new DateTime(2009, 08, 01));

2)我需要编写LINQ查询以按列1分组,并将分组的行发送到返回值double的方法。像这样的东西

var query = from t in table1
            group t by t.col1 into g
            select new { r1 = g.Key, r2=mycalc(g))

3)并具有扩展功能:

public static double Median(this IEnumerable<DataSet1.DataTable1Row> source)
{
  //calc using the grouped row data and return a dobule
}

我一直在研究这个问题并且不太明白。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:3)

嗯,目前还不完全清楚哪个位导致问题。如果您已完成Median方法,则可以将query更改为:

var query = from t in table1
            group t by t.col1 into g
            select new { r1 = g.Key, r2=g.Median() };

Median位是否会导致您出现问题?它可能是最简单的来做类似的事情:

public static double Median(this IEnumerable<DataSet1.DataTable1Row> source)
{
    List<double> values = source.Select(x => x.col2).ToList();
    values.Sort();
    if ((values.Count % 2) == 1) // Odd number of values
    {
        return values[values.Count/2];
    }
    else // Even number of values: find mean of middle two
    {
        return (values[values.Count/2] + values[values.Count/2 + 1]) / 2;
    }
}

可能有更有效的方法,但我不知道......