使用linq或数据视图过滤器从c#中的DataTable中获取最高日期的行

时间:2018-07-20 06:55:28

标签: c# asp.net linq

我能够获得最高的 date列值,但是我希望整个单个数据行的日期都最高。

DataTable dt = new DataTable();

dt.Columns.Add("City Name");
dt.Columns.Add("date");
dt.Rows.Add("Mumbai", "17/07/2018");
dt.Rows.Add("Surat", "17/02/2018");
dt.Rows.Add("Borivali", "17/10/2018");
dt.Rows.Add("Pune", "10/05/2018");
dt.Rows.Add("Valsad", "17/09/2018");

var query = dt.AsEnumerable().Max(x => x[1]);

2 个答案:

答案 0 :(得分:0)

创建一个类PersonModel来承载DataTable中的属性。

您需要将"17/07/2018"字符串设为DateTime,因此请使用DateTime.ParseExact方法。

然后,PersonModel类需要实现IComparable接口,以告诉MAX函数如何进行比较。

public class PersonModel : IComparable
{
    public string Name { get; set; }
    public DateTime Dt { get; set; }

    public int CompareTo(object obj)
    {
        var compareObj = obj as PersonModel;
        return compareObj.Dt > this.Dt? 0:1;
    }
}

var query = dt.AsEnumerable().Max(x => 
    new PersonModel {
        Name = x[0].ToString(),
        Dt = DateTime.ParseExact(x[1].ToString(), "dd/MM/yyyy", CultureInfo.InvariantCulture)
    }
);

答案 1 :(得分:0)

首先,我建议更改格式:使用DateTime时为什么要使用String

  DataTable dt = new DataTable();

  dt.Columns.Add("City Name");
  dt.Columns.Add("date");

  dt.Rows.Add("Mumbai",   new DateTime(2018,  7, 17));
  dt.Rows.Add("Surat",    new DateTime(2018,  2, 17));
  dt.Rows.Add("Borivali", new DateTime(2018, 10, 17));
  dt.Rows.Add("Pune",     new DateTime(2018,  5, 10));
  dt.Rows.Add("Valsad",   new DateTime(2018,  9, 17));

您正在寻找标准 Linq 不支持的ArgMax,但可以通过{{1 }}:

Aggregate

结果:

  var row = dt
    .AsEnumerable()
    .Aggregate((s, a) => Convert.ToDateTime(s[1]) > Convert.ToDateTime(a[1]) ? s : a);

  Console.Write($"{row[0]} {row[1]:dd/MM/yyyy}");

如果您坚持使用原始格式,则必须将 Borivali 17/10/2018 解析为string

DateTime