C# 如何在某个日期之前从数据表中删除行?

C# 如何在某个日期之前从数据表中删除行?,c#,.net,select,datatable,filtering,C#,.net,Select,Datatable,Filtering,我在筛选数据表时遇到问题,例如DtFromExcel。DataTable没有标题行,它从一个实际的数据行开始,如下所示 1 | 05/01/2020 Fri | ABC | XYZ | ... 2 | 05/01/2020 Fri | AAA | WKV | ... 3 | 05/02/2020 Sat | BCD | OPQ | ... 4 | 05/03/2020 Sun | CDE | RST | ... 5 | 05/03/2020 Sun | EFA | FAY | ... 6 | 0

我在筛选数据表时遇到问题,例如
DtFromExcel
。DataTable没有标题行,它从一个实际的数据行开始,如下所示

1 | 05/01/2020 Fri | ABC | XYZ | ...
2 | 05/01/2020 Fri | AAA | WKV | ...
3 | 05/02/2020 Sat | BCD | OPQ | ...
4 | 05/03/2020 Sun | CDE | RST | ...
5 | 05/03/2020 Sun | EFA | FAY | ...
6 | 05/03/2020 Sun | AXG | EAS | ...
7 | 05/04/2020 Mon | DEF | LMN | ...
8 | 05/04/2020 Mon | SXA | YTR | ...
9 | 05/05/2020 Tue | DAF | AAG | ...
第二列包含带有一些额外字符串的特定日期(星期几),这些行按此日期列排序。可以有多个日期相同的行

现在,我想删除date列包含某个日期的行以及该日期之前的任何行。例如,如果某个日期是
05/04/2020
,那么我需要删除第8行之前的所有行,以便剩下的数据表必须如下所示

9 | 05/05/2020 Tue | DAF | AAG | ...
我的问题是,首先我不知道如何过滤没有列名的数据表。我曾考虑过在不覆盖第一个实际数据行的情况下分配一个标题行,但这似乎是一个很大的工作,只是为了过滤。其次,我不知道如何使用这些条件((a)第二列包含某个日期,
(b)日期早于该日期的任何行)

private void DeleteRows(DateTime certainDate){
DataRow[]targetRowsToDelete=dtFromExcel。选择(/*不确定在此处放入什么*/);
foreach(targetRowsToDelete中的数据行)
{
如果(Convert.ToDateTime(行[1].ToString().Split(c“”)[0])如果使用创建没有名称的
DataColumn
,文档将声明

创建时,
数据列
对象没有默认的
列名
标题
。将其添加到
数据列集合
时,如果没有为
列名
指定名称,则将生成默认名称(
“Column1”
“Column2”
,等等)

…因此创建和加载一个
数据表
,如下所示

const string Input=@“1 | 05/01/2020周五ABC | XYZ”。。。
2020年1月5日星期五AAA WKV。。。
2020年2月5日星期六。。。
2020年3月4日星期日。。。
2020年3月5日星期日全民教育日。。。
6 | 2020年3月5日Sun | AXG | EAS |。。。
2020年4月7日星期一。。。
2020年4月8日星期一星期日。。。
2020年5月5日星期二(星期二);
DtFromExcel=新数据表();
对于(int i=0;i<5;i++)
{
DataColumn column=新的DataColumn();
WriteLine($“Column{i}具有ColumnName\“{Column.ColumnName}\”);
DtFromExcel.Columns.Add(column);
WriteLine($“Column{i}具有ColumnName\“{Column.ColumnName}\”);
}
foreach(Input.Split(“\r\n”)中的字符串行)
{
string[]fields=line.Split(“|”);
DtFromExcel.Rows.Add(字段);
}
…生成此输出

Column 0 has ColumnName "" Column 0 has ColumnName "Column1" Column 1 has ColumnName "" Column 1 has ColumnName "Column2" Column 2 has ColumnName "" Column 2 has ColumnName "Column3" Column 3 has ColumnName "" Column 3 has ColumnName "Column4" Column 4 has ColumnName "" Column 4 has ColumnName "Column5" 无论哪种方式,您都会有一个已知的名称,可以通过该名称引用该列

至于您关于不希望“遍历整个
数据表
”的评论,不清楚您的意思是因为额外的代码还是可能的性能影响,但对于后一点,即使您没有显式遍历和测试每个
数据行
选择()
。注意,由于您说行是按日期排序的,因此可以利用该漏洞在找到搜索范围之外的日期后立即停止扫描行

private static DateTime GetRowDate(DataRow行)=>DateTime.ParseExact(
(字符串)行[“MyDateColumn”],“MM/dd/yyyy ddd”,空
);
私有void DeleteRows(DateTime maxDate)
{
DataRow[]rowsToRemove=DtFromExcel.AsEnumerable()
.TakeWhile(行=>GetRowDate(行)
Column 0 has ColumnName ""
Column 0 has ColumnName "Column1"
Column 1 has ColumnName ""
Column 1 has ColumnName "Column2"
Column 2 has ColumnName ""
Column 2 has ColumnName "Column3"
Column 3 has ColumnName ""
Column 3 has ColumnName "Column4"
Column 4 has ColumnName ""
Column 4 has ColumnName "Column5"