C#DataTable获取限制内最新最大值的行号

时间:2016-08-22 14:57:18

标签: c# datatable max limit

我想在最近一小时内找到C#DataTable中最新最大值的行号,其中包含以下列:名称分数UnixTS。但似乎无法使查询正确。我可以轻松地从所有值获取最新最大值的行号,或者只要一小时尚未通过。但是一旦超过一小时,如果存在较早的最大值,则行号为空。

我试过了:

query = "UnixTS > " + fromUnixTS + " AND [Score] = MAX([Score])";
theRow = scoreTable.Select(query, "UnixTS DESC");

query = "[Score] = MAX([Score]) where UnixTS > fromUnixTS";

其中fromUnixTS现在是 - 3600。甚至是类似SQL的查询:

query = "SELECT * MAX([Score]) FROM scoreTable WHERE UnixTS > fromUnixTS ORDER BY UnixTS LIMIT 1":

或:

var theRow = scoreTable.AsEnumerable().Where(row => row.Field<int>("UnixTS") > fromUnixTS).Max(row => row.Field<int>("Score")).OrderByDescending<int>("UnixTX");

但没有运气。好吧,我不熟悉C#,但任何帮助都会受到赞赏吗?

嗯,似乎无法使用WHERE--(但我找到了前进的方法:

query = "UnixTS > " + fromUnixTS";
theRow = scoreTable.Select(query, "Score DESC, UnixTS DESC");

不是我必须承认的最聪明的方式。难道没有一种聪明的方式来使用MAX吗?

1 个答案:

答案 0 :(得分:1)

这样的东西?

DataTable scoreTableNew = scoreTable.AsEnumerable().Where(x => x.Field<DateTime>("UnixTS") > DateTime.Now.AddHours(-1)).OrderByDescending(y => y["Score"]).Take(1).CopyToDataTable();

我们首先获取最后一小时的所有行,按降序按分数排序,然后选择最上一行。

Linq中没有MAX,除非你使用morelinq扩展名(你可以从NuGet获得morelinq)。它有MaxBy

<强>更新

        DataTable scoreTable = new DataTable();
        scoreTable.Columns.Add("UnixTS", typeof(DateTime));
        scoreTable.Columns.Add("Score", typeof(int));

        scoreTable.Rows.Add(DateTime.Now.AddMinutes(-30), 10);
        scoreTable.Rows.Add(DateTime.Now.AddMinutes(-130), 40);
        scoreTable.Rows.Add(DateTime.Now.AddMinutes(-59), 20);
        scoreTable.Rows.Add(DateTime.Now.AddMinutes(-59), 20);
        scoreTable.Rows.Add(DateTime.Now.AddMinutes(-20), 25);

        DataTable scoreTableNew = scoreTable.AsEnumerable().Where(x => x.Field<DateTime>("UnixTS") > DateTime.Now.AddHours(-1)).OrderByDescending(y => y["Score"]).Take(1).CopyToDataTable();

        Response.Write(Convert.ToDateTime(scoreTableNew.Rows[0][0]).ToShortDateString() + " - " + scoreTableNew.Rows[0][1].ToString());