使用linq或数据视图过滤器从c#中的DataTable中获取最高日期行
我可以得到最高的日期列值,但我想要的是日期最高的整个数据行使用linq或数据视图过滤器从c#中的DataTable中获取最高日期行,c#,asp.net,linq,C#,Asp.net,Linq,我可以得到最高的日期列值,但我想要的是日期最高的整个数据行 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", "1
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]);
创建一个类
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)
}
);
首先,我建议更改格式:在使用
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
,但可以通过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
如果坚持原始格式,则必须将字符串
s解析为日期时间
:
var row = dt
.AsEnumerable()
.Aggregate((s, a) =>
DateTime.ParseExact(s[1].ToString(), "d/M/yyyy", CultureInfo.InvariantCulture) >
DateTime.ParseExact(a[1].ToString(), "d/M/yyyy", CultureInfo.InvariantCulture)
? s : a);
聚合在这里是如何工作的,这是不是先列出所有行,然后逐个比较?你能解释一下吗。@Tiger:Aggregate从第一行开始,将其分配给
s
,然后枚举所有其他行,从当前行a
和s
生成新的聚合值(这是先前的聚合行)