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
}
我一直在研究这个问题并且不太明白。有人可以帮忙吗?
答案 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;
}
}
可能有更有效的方法,但我不知道......