Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.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
使用linq或数据视图过滤器从c#中的DataTable中获取最高日期行_C#_Asp.net_Linq - Fatal编程技术网

使用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
生成新的聚合值(这是先前的聚合行)