Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.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# 在LINQ选择中使用公式_C#_Linq - Fatal编程技术网

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查询。