C# 在LINQ选择中使用公式
我有一个如下所示的数据表:C# 在LINQ选择中使用公式,c#,linq,C#,Linq,我有一个如下所示的数据表: Row Side Value 1 A 34.8 1 B 33.9 1 C 33.1 2 A 32.6 2 B 32.0 2 C 35.7 3 A 34.6 3 B 34.0 3 C 33.5 我需要做的一件事是计算我喜欢的每一行的平均值: var avg = (from row in dt.AsEnumerable()
Row Side Value
1 A 34.8
1 B 33.9
1 C 33.1
2 A 32.6
2 B 32.0
2 C 35.7
3 A 34.6
3 B 34.0
3 C 33.5
我需要做的一件事是计算我喜欢的每一行的平均值:
var avg = (from row in dt.AsEnumerable()
group row by new { RowMeas = row.Field<string>("Row") } into grp
select new
{
RowMeas = grp.Key.RowMeas,
AVG = grp.Average(r => r.Field<double>("Value"))
}).ToList();
var avg=(来自dt.AsEnumerable()中的行)
按新的{RowMeas=row.Field(“row”)}将行分组到grp中
选择新的
{
RowMeas=grp.Key.RowMeas,
平均值=grp.平均值(r=>r.字段(“值”))
}).ToList();
现在,我需要做一些类似的事情,但不是简单地取平均值,我想对每一行使用一个公式,比如4*a+3*B+2*C
我可以像上面那样使用LINQ,而不是AVG来计算这个公式吗?在其他软件中,我们通过转置datatable手动执行此计算,以便有A、B、C列,然后可以在新列的公式中使用这些列。由于在C语言中没有一种简单的转置方法,我希望我可以使用LINQ来实现这一点。var dt=new DataTable();
var dt = new DataTable();
dt.Columns.Add("Row", typeof(string));
dt.Columns.Add("Side", typeof(string));
dt.Columns.Add("Value", typeof(double));
dt.Rows.Add(1, "A", 34.8);
dt.Rows.Add(1, "B", 33.9);
dt.Rows.Add(1, "C", 33.1);
dt.Rows.Add(2, "A", 32.6);
dt.Rows.Add(2, "B", 32.0);
dt.Rows.Add(2, "C", 35.7);
dt.Rows.Add(3, "A", 34.6);
dt.Rows.Add(3, "B", 34.0);
dt.Rows.Add(3, "C", 33.5);
var query = dt
.AsEnumerable()
.GroupBy(x => x.Field<string>("Row"))
.Select(x => new
{
Row = x.Key,
A = x.Where(y => y.Field<string>("Side") == "A").Select(z => z.Field<double>("Value")).FirstOrDefault(),
B = x.Where(y => y.Field<string>("Side") == "B").Select(z => z.Field<double>("Value")).FirstOrDefault(),
C = x.Where(y => y.Field<string>("Side") == "C").Select(z => z.Field<double>("Value")).FirstOrDefault()
})
.Select(x => new
{
Row = x.Row,
Result = 4 * x.A + 3 * x.B + 2 * x.C
})
;
foreach (var q in query)
Console.WriteLine("Row = {0}, Result = {1}", q.Row, q.Result);
添加(“行”,类型(字符串));
dt.Columns.Add(“Side”,typeof(string));
dt.列。添加(“值”,类型(双));
增加(1,“A”,34.8);
增加(1,“B”,33.9);
增加(1,“C”,33.1);
增加(2,“A”,32.6);
增加(2,“B”,32.0);
增加(2,“C”,35.7);
增加(3,“A”,34.6);
增加(3,“B”,34.0);
增加(3,“C”,33.5);
var query=dt
.可计算的()
.GroupBy(x=>x.Field(“行”))
.选择(x=>new
{
Row=x.键,
A=x.Where(y=>y.Field(“Side”)==“A”)。选择(z=>z.Field(“Value”))。FirstOrDefault(),
B=x.Where(y=>y.Field(“Side”)==“B”)。选择(z=>z.Field(“Value”)).FirstOrDefault(),
C=x.Where(y=>y.Field(“Side”)==“C”)。选择(z=>z.Field(“Value”)。FirstOrDefault()
})
.选择(x=>new
{
行=x.行,
结果=4*x.A+3*x.B+2*x.C
})
;
foreach(查询中的var q)
WriteLine(“Row={0},Result={1}”,q.Row,q.Result);
导致LinqPad。
var dt=new DataTable();
添加(“行”,类型(字符串));
dt.Columns.Add(“Side”,typeof(string));
dt.列。添加(“值”,类型(双));
增加(1,“A”,34.8);
增加(1,“B”,33.9);
增加(1,“C”,33.1);
增加(2,“A”,32.6);
增加(2,“B”,32.0);
增加(2,“C”,35.7);
增加(3,“A”,34.6);
增加(3,“B”,34.0);
增加(3,“C”,33.5);
var query=dt
.可计算的()
.GroupBy(x=>x.Field(“行”))
.选择(x=>new
{
Row=x.键,
A=x.Where(y=>y.Field(“Side”)==“A”)。选择(z=>z.Field(“Value”))。FirstOrDefault(),
B=x.Where(y=>y.Field(“Side”)==“B”)。选择(z=>z.Field(“Value”)).FirstOrDefault(),
C=x.Where(y=>y.Field(“Side”)==“C”)。选择(z=>z.Field(“Value”)。FirstOrDefault()
})
.选择(x=>new
{
行=x.行,
结果=4*x.A+3*x.B+2*x.C
})
;
foreach(查询中的var q)
WriteLine(“Row={0},Result={1}”,q.Row,q.Result);
导致LinqPad。
Entity Framework的LINQ查询语言在它的功能和T-SQL的功能上受到限制。SQLServer有一组非常简单的聚合函数,因此EF可以调用这些函数。您真正想要做的是透视查询,以便为每个
行
获得一个A值、一个B值和一个C值。如果你能做到这一点,那么(用C#)进行计算将是微不足道的。对LINQ、EF和“pivot”这个词进行简单的搜索,会让人觉得你运气不佳。其他人可能会插嘴,但看起来不太好。我希望我的评论能有所帮助。在做进一步的研究时,这似乎是一个方向,就像这样:谢谢!实体框架的LINQ查询语言在它能做什么和T-SQL能做什么之间受到限制。SQLServer有一组非常简单的聚合函数,因此EF可以调用这些函数。您真正想要做的是透视查询,以便为每个行
获得一个A值、一个B值和一个C值。如果你能做到这一点,那么(用C#)进行计算将是微不足道的。对LINQ、EF和“pivot”这个词进行简单的搜索,会让人觉得你运气不佳。其他人可能会插嘴,但看起来不太好。我希望我的评论能有所帮助。在做进一步的研究时,这似乎是一个方向,就像这样:谢谢!是的,但这不是EF查询。如果您对数据库使用该查询,我不知何故怀疑这是否有效。OP从未提及EF。事实上,他们从“我有一个DataTable”开始,并使用DataTable/DataRow方法谢谢你们。是的,我已经有了我需要操纵的数据表,所以韩的答案很好。我会记住Flydog的未来用于EF查询。是的,但这不是EF查询。如果您对数据库使用该查询,我不知何故怀疑这是否有效。OP从未提及EF。事实上,他们从“我有一个DataTable”开始,并使用DataTable/DataRow方法谢谢你们。是的,我已经有了我需要操纵的数据表,所以韩的答案很好。我会记住Flydog,以便将来用于EF查询。