您在这里有几个选择:
1.添加主键
您可以在创建数据表时为其添加主键。
假设您有一个名为“Id”的列,那么您将这样做:
AllItems.PrimaryKey = new DataColumn[] { workTable.Columns["Id"] };}
或者,对于您的主键是复合键(多列)的情况:
AllItems.PrimaryKey = new DataColumn[] {
workTable.Columns["Id"],
workTable.Columns["Name"] };}
这将允许 Contains 正常工作。
2.使用数据视图
您可以使用 DataView 过滤掉不同的行;
DataView view = new DataView(AllItems);
DataTable distinctValues = view.ToTable(true, "Column1", "Column2" , ..., "ColumnN");
3. 使用 Select 查找匹配行
或者,您可以依靠SelectItems
方法根据类似于 SQL WHEREclause 的语句来测试 DataTable 中是否存在相应的行:
List<DataRow> rowsToRemove = new List<DataRow>();
foreach(DataRow allItemRow in AllItems.Rows)
{
if(Items.Select(String.Format("Id = {0}"),
allItemRow.Field<Int32>("Id")).Length == 0)
{
rowsToRemove.Add(allItemRow);
}
}
rowsToRemove.ForEach(x => x.Delete());
AllItems.AcceptChanges();
请注意,在迭代 AllItems 中的 Rows 集合时,不要删除行,这一点很重要——而是收集这些行,然后将它们删除。
4. 中途过滤
另请注意,我还没有尝试过,但是,根据您从 Excel 中选择行的方式,您可以使用 SQL DISTINCT 子句;如果您使用ODBC 从 Excel 加载数据,那么您可以尝试从源头过滤。