C# 使用Linq第一组特定列值,然后对第二列的值进行平均

C# 使用Linq第一组特定列值,然后对第二列的值进行平均,c#,linq,C#,Linq,我的Datatable有两列URL和ResponseTime URL ResponseTime Login.aspx 2 Login.aspx 3 Login.aspx 4 Login.aspx 5 WelcomePage.aspx 6 WelcomePage.aspx 7 WelcomePage.aspx 8 WelcomePage.aspx 9 LogOut.aspx

我的Datatable有两列URL和ResponseTime

URL             ResponseTime
Login.aspx          2
Login.aspx          3
Login.aspx          4
Login.aspx          5
WelcomePage.aspx    6
WelcomePage.aspx    7
WelcomePage.aspx    8
WelcomePage.aspx    9
LogOut.aspx         10
LogOut.aspx         10
LogOut.aspx         11
LogOut.aspx         11
我想把它和一个URL的平均响应时间值组合起来。 是否有相同的Linq语法

URL             AvgResponseTime
Login.aspx          3.5
WelcomePage.aspx    7.5
LogOut.aspx         10.5

var result=dt.AsEnumerable().GroupBy(x=>x.Field(“URL”))。选择(x=>new
{ 
URL=x.Key,
AvgResponseTime=x.Average(y=>y.Field(“响应时间”))
});
这里有一个更动态的解决方案。它以字典列表的形式返回结果

dtResponseTimes.AsEnumerable().GroupBy(x => x["X_Axis_Categories"].ToString()).Select(x =>
{
    var keyValues = new Dictionary<string, object>();
    keyValues.Add("URL", x.Key);

    foreach (DataColumn column in dtResponseTimes.Columns)
    {
        if (column.ColumnName.Contains("ResponseTime"))
        {
            keyValues.Add(
                column.ColumnName, 
                x.Average(Y => Convert.ToInt32(Y[column.ColumnName]))
            );
        }
    }

    return keyValues;
}
dtResponseTimes.AsEnumerable().GroupBy(x=>x[“x\u轴\u类别]).ToString()。选择(x=>
{
var keyValues=新字典();
添加(“URL”,x.Key);
foreach(dtResponseTimes.Columns中的DataColumn列)
{
if(column.ColumnName.Contains(“ResponseTime”))
{
keyValues.Add(
column.ColumnName,
x、 平均值(Y=>Convert.ToInt32(Y[column.ColumnName]))
);
}
}
返回键值;
}

您可以使用
GroupBy
Average
方法来获得所需的结果:

var result = (
        from row in dt.AsEnumerable()
        group row by new { Col1 = row["url"] } into g
        select new
        {
            Col1 = g.Key.Col1,
            AvgVal1 = g.Average(x => x.Field<decimal>("responseTime")),
        }
var结果=(
从dt.AsEnumerable()中的行开始
按新的{Col1=row[“url”]}将行分组到g中
选择新的
{
Col1=g.Key.Col1,
AvgVal1=g.平均值(x=>x.字段(“响应时间”),
}
整个代码:

var dt = new DataTable();
        dt.Columns.Add("responseTime", typeof(decimal));
        dt.Columns.Add("url");            

        AddRow(dt, "Login.aspx", 2);
        AddRow(dt, "Login.aspx", 3);
        AddRow(dt, "Login.aspx", 4);
        AddRow(dt, "Login.aspx", 5);
        AddRow(dt, "WelcomePage.aspx", 6);
        AddRow(dt, "WelcomePage.aspx", 7);
        AddRow(dt, "WelcomePage.aspx", 8);
        AddRow(dt, "WelcomePage.aspx", 9);
        AddRow(dt, "LogOut.aspx", 10);
        AddRow(dt, "LogOut.aspx", 10);
        AddRow(dt, "LogOut.aspx", 11);
        AddRow(dt, "LogOut.aspx", 11);
        var result = (
            from row in dt.AsEnumerable()
            group row by new { Col1 = row["url"] } into g
            select new
            {
                Col1 = g.Key.Col1,
                AvgVal1 = g.Average(x => x.Field<decimal>("responseTime")),
            }
        ).ToList();

static void AddRow(DataTable dt, string url, int responseTime)
{
    var row = dt.NewRow();
    row["url"] = url;
    row["responseTime"] = responseTime;
    dt.Rows.Add(row);            
}
var dt=new DataTable();
添加(“响应时间”,类型(十进制));
添加(“url”);
AddRow(dt,“Login.aspx”,2);
AddRow(dt,“Login.aspx”,3);
AddRow(dt,“Login.aspx”,4);
AddRow(dt,“Login.aspx”,5);
AddRow(dt,“WelcomePage.aspx”,6);
AddRow(dt,“WelcomePage.aspx”,第7页);
AddRow(dt,“WelcomePage.aspx”,8);
AddRow(dt,“WelcomePage.aspx”,第9页);
AddRow(dt,“LogOut.aspx”,10);
AddRow(dt,“LogOut.aspx”,10);
AddRow(dt,“LogOut.aspx”,11);
AddRow(dt,“LogOut.aspx”,11);
var结果=(
从dt.AsEnumerable()中的行开始
按新的{Col1=row[“url”]}将行分组到g中
选择新的
{
Col1=g.Key.Col1,
AvgVal1=g.平均值(x=>x.字段(“响应时间”),
}
).ToList();
静态void AddRow(DataTable dt、字符串url、int responseTime)
{
var row=dt.NewRow();
行[“url”]=url;
行[“响应时间”]=响应时间;
dt.行。添加(行);
}

请分享您尝试过的内容以及数据表示的方式。我尝试了此操作,但给出指定的强制转换无效。error@prashanatchaudharidatatable中列的类型是什么?这可能是因为“ResponseTime”列的类型不是
int
@prashanatchaudhari,否则请尝试替换
y.Field(“ResponseTime”)
转换为.ToInt32(y[“ResponseTime”])
@NicoHaase代码是不言自明的,这就是为什么其他答案也没有提供任何解释的原因。先生,这对我来说适用于固定列URL和ResponseTimes,我想问一下,如果我们有ResponseTimes 1Vu、ResponseTimes 5Vu等动态列以及其中的值,那么我们如何实现这一点?
var dt = new DataTable();
        dt.Columns.Add("responseTime", typeof(decimal));
        dt.Columns.Add("url");            

        AddRow(dt, "Login.aspx", 2);
        AddRow(dt, "Login.aspx", 3);
        AddRow(dt, "Login.aspx", 4);
        AddRow(dt, "Login.aspx", 5);
        AddRow(dt, "WelcomePage.aspx", 6);
        AddRow(dt, "WelcomePage.aspx", 7);
        AddRow(dt, "WelcomePage.aspx", 8);
        AddRow(dt, "WelcomePage.aspx", 9);
        AddRow(dt, "LogOut.aspx", 10);
        AddRow(dt, "LogOut.aspx", 10);
        AddRow(dt, "LogOut.aspx", 11);
        AddRow(dt, "LogOut.aspx", 11);
        var result = (
            from row in dt.AsEnumerable()
            group row by new { Col1 = row["url"] } into g
            select new
            {
                Col1 = g.Key.Col1,
                AvgVal1 = g.Average(x => x.Field<decimal>("responseTime")),
            }
        ).ToList();

static void AddRow(DataTable dt, string url, int responseTime)
{
    var row = dt.NewRow();
    row["url"] = url;
    row["responseTime"] = responseTime;
    dt.Rows.Add(row);            
}