linq - 使用 linq 从数据表中按顺序返回结果
问题描述
我正在从我的应用程序中的 excel 表中获取行,该表包含来自生物识别机器的出勤记录。为了获得最佳结果,我必须删除冗余数据。为此,我必须定期管理入住和退房时间。例如,先签入时间进入,然后签出时间吃午餐,然后再次签入返回,最后签出回家。同时,excel 中的行包含多个签入和签出,因为员工倾向于为两者做更多的事情。
我设法从excel中获取记录并添加到数据表中。现在对于序列和排序部分,我正在努力实现我想要的结果。下面是我的代码。
protected void btnSaveAttendance_Click(object sender, EventArgs e)
{
try
{
if (FileUpload1.HasFile && Path.GetExtension(FileUpload1.FileName) == ".xls")
{
using (var excel = new OfficeOpenXml.ExcelPackage(FileUpload1.PostedFile.InputStream))
{
var tbl = new DataTable();
var ws = excel.Workbook.Worksheets.First();
var hasHeader = true; // adjust accordingly
// add DataColumns to DataTable
foreach (var firstRowCell in ws.Cells[1, 1, 1, ws.Dimension.End.Column])
tbl.Columns.Add(hasHeader ? firstRowCell.Text
: String.Format("Column {0}", firstRowCell.Start.Column));
// add DataRows to DataTable
int startRow = hasHeader ? 2 : 1;
for (int rowNum = startRow; rowNum <= ws.Dimension.End.Row; rowNum++)
{
var wsRow = ws.Cells[rowNum, 1, rowNum, ws.Dimension.End.Column];
DataRow row = tbl.NewRow();
foreach (var cell in wsRow)
row[cell.Start.Column - 1] = cell.Text;
tbl.Rows.Add(row);
}
var distinctNames = (from row in tbl.AsEnumerable()
select row.Field<string>("Employee Code")).Distinct();
DataRow[] dataRows = tbl.Select().OrderBy(u => u["Employee Code"]).ToArray();
var ss = dataRows.Where(p => p.Field<string>("Employee Code") == "55").ToArray();
}
}
}
catch (Exception ex) { }
}
我得到的结果是:
Employee Code Employee Name Date Time In / Out
55 Alex 12/27/2018 8:59 IN
55 Alex 12/27/2018 8:59 IN
55 Alex 12/27/2018 13:00 OUT
55 Alex 12/27/2018 13:00 OUT
55 Alex 12/27/2018 13:48 IN
55 Alex 12/27/2018 13:49 IN
55 Alex 12/27/2018 18:08 OUT
我希望先进后出,然后进出。这将迭代四次以生成结果。
预期结果是:
Employee Code Employee Name Date Time In / Out
55 Alex 12/27/2018 8:59 IN
55 Alex 12/27/2018 13:00 OUT
55 Alex 12/27/2018 13:48 IN
55 Alex 12/27/2018 18:08 OUT
解决方案
你可以尝试在下面的结果中做groupby
ss=ss.GroupBy(x=>x.DateTime).ToArray();
构建一个逻辑,如果您的结果有 2 个连续的 In/Out 作为示例,如下所示。这里我认为是字段名
var tt;
for(int i=0;i<ss.Count();i++)
{
if(ss[i].In=="In" && (tt!=null || tt.LastOrDefault().In!="In"))
tt=ss[i];
else if(ss[i].In=="Out" && (tt!=null || tt.LastOrDefault().In!="Out"))
tt=ss[i];
}
推荐阅读
- javascript - 如何使用@sendgrid/mail 发送 zip 文件
- reactjs - reactjs中如何访问componentDidMount中的状态变量
- python - 需要来自 List1 的 List2 元素的公因数
- snmp - 设置引擎 ID 时没有 SNMP 守护程序重新启动
- php - 表格倒数第二列内的下拉菜单不起作用
- javascript - SequelizeDatabaseError:删除不存在的 ENUM 类型,但它们确实存在
- amazon-web-services - 为什么 Dash 应用程序无法在 AWS Cloud9 中预览?
- c# - 如何过滤 3 级 wpf 树视图
- python-3.x - 如何在python中安装sympy包
- c# - 根据条件调用方法的更好方法