现在有这样一个Excel表,数据格式如图,我现在已经将Excel转换成DataTable了,Excel表是乱序的,现在要筛选同一个人同一天最早进的刷卡记录和最晚出的刷卡记录,业务要求不依赖于排序,不对dataTable进行delete(),操作。
我自己写的一个版本是这样的
#region Version 1
//if (dt != null && dt.Rows.Count > 1)
//{
// dt.Columns[0].ColumnName = "F1";
// dt.Rows.RemoveAt(0);
// dt.DefaultView.Sort = "F1,F6 ASC";
// dt = dt.DefaultView.ToTable();
//}
//int j = 0;
////定义out的对比数据
//string tempNo = "";
//string tempDate = "";
//string tempFlag = "out";
////定义in的对比数据
//string tempNo2 = "";
//string tempDate2 = "";
//string tempFlag2 = "in";
//for (int i = 0; i < dt.Rows.Count; i++)
//{
// if (string.IsNullOrEmpty(dt.Rows[i][0].ToString())) //为避免最后一行为空
// {
// break;
// }
// if (i >= dt.Rows.Count)
// {
// break;
// }
// if (dt.Rows[i][6].ToString() == "in")
// {
// if (string.IsNullOrEmpty(tempNo2))
// {
// tempNo2 = dt.Rows[i][0].ToString();
// tempDate2 = dt.Rows[i][5].ToString();
// }
// else
// {
// //比较in
// if (Convert.ToDateTime(tempDate2).ToString("yyyy-MM-dd") == Convert.ToDateTime(dt.Rows[i][5]).ToString("yyyy-MM-dd"))//比较当前行和模板是否为同一天
// {
// if (Convert.ToDateTime(tempDate2) > Convert.ToDateTime(dt.Rows[i][5])) //如果当前行的时间早于模板时间,则删除模板时间行,并记录模板行下标
// {
// tempDate2 = dt.Rows[i][5].ToString();
// dt.Rows[i - 1].Delete();
// i -= 1;
// }
// else
// {
// dt.Rows[i].Delete(); //否则删除当前行
// i -= 1;
// }
// }
// else
// {
// tempDate2 = dt.Rows[i][5].ToString();
// }
// }
// }
// else
// {
// if (dt.Rows[i][6].ToString() == "out")
// {
// if (string.IsNullOrEmpty(tempNo))
// {
// tempNo = dt.Rows[i][0].ToString();
// tempDate = dt.Rows[i][5].ToString();
// }
// else
// {
// //比较out
// if (Convert.ToDateTime(tempDate).ToString("yyyy-MM-dd") == Convert.ToDateTime(dt.Rows[i][5]).ToString("yyyy-MM-dd"))
// {
// if (Convert.ToDateTime(tempDate) < Convert.ToDateTime(dt.Rows[i][5]))
// {
// tempDate = dt.Rows[i][5].ToString();
// dt.Rows[i - 1].Delete();
// i -= 1;
// }
// else
// {
// dt.Rows[i].Delete();
// i -= 1;
// }
// }
// else
// {
// tempDate = dt.Rows[i][5].ToString();
// }
// }
// }
// }
//}