如何修复error CS0021:无法对object类型表达式应用[]索引器?
修复error CS0021并实现DataRow删除需求
错误原因
error CS0021的本质是你遍历DataTable.Rows时,将行对象声明为了object类型——object没有索引器,自然无法通过row["TestDate"]访问字段值。
修复方案
方案一:修正遍历逻辑(直接操作DataRow)
将遍历的行类型明确为DataRow,同时倒序遍历(避免删除行后原集合索引错乱),再强转字段值进行判断:
DateTime targetDate = new DateTime(2019, 11, 1); // 倒序遍历,防止删除行后索引偏移 for (int i = dt_test.Rows.Count - 1; i >= 0; i--) { DataRow row = dt_test.Rows[i]; // 先判断字段是否为空,避免转型报错 if (row["TestDate"] != DBNull.Value) { DateTime testDate = (DateTime)row["TestDate"]; if (testDate > targetDate) { dt_test.Rows.Remove(row); } } }
方案二:正确使用LINQ实现
LINQ不能直接遍历原集合删除元素,需先将待删除行存入独立列表,再批量处理:
DateTime targetDate = new DateTime(2019, 11, 1); // 筛选出所有符合条件的行,存入List避免遍历原集合时修改 var rowsToDelete = dt_test.AsEnumerable() .Where(row => row.Field<DateTime>("TestDate") > targetDate) .ToList(); // 批量删除 foreach (var row in rowsToDelete) { row.Delete(); } // 提交更改,让删除生效 dt_test.AcceptChanges();
额外注意事项
- 如果
TestDate字段允许为空,需用row.Field<DateTime?>("TestDate")处理可空类型,避免DBNull转换异常 - 无论用哪种方式,都不要在正向遍历原
Rows集合时直接删除行,会触发集合修改异常
内容的提问来源于stack exchange,提问作者user22446909
相关产品推荐
相关产品推荐

