3

对 LINQ 相当陌生,并试图将我的头脑围绕在扩展方法上。我正在尝试做的事情:

1)有一个三列的表,col1(字符串),col2(双),col3(日期时间)

        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
}

我已经为此工作了一段时间,但不太明白。有人可以帮忙吗?

4

1 回答 1

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;
    }
}

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

于 2009-09-22T13:18:02.923 回答