从数据表中删除与List<string>匹配的行

4
我有一个 DataTable,我想删除所有与 List<string> 匹配的行,该怎么做?以下是我的代码,
public static DataTable GetSkills(List<Skill> EnteredSkills)
{
    DataTable dt = new DataTable();
    dt = GetDBMaster("SkillMaster");
    List<string> MatchingSkills = EnteredSkills.Select(c => c.Text).ToList();
    //Logic to Delete rows MatchingSkills from dt here
    return dt;
}

最终解决方案

    public static DataTable GetSkills(List<Skill> EnteredSkills)
    {
        DataTable dt = new DataTable();
        dt = GetDBMaster("SkillMaster");
        var MatchingSkills = new HashSet<string>(EnteredSkills.Select(c => c.Text));
        List<DataRow> removeRows = dt.AsEnumerable().Where(r => MatchingSkills.Contains(r.Field<string>("DataTableSkillColumnName"))).ToList();
        removeRows.ForEach(dt.Rows.Remove);
        return dt;
    }

你不能简单地循环检查匹配的行并从数据表中删除它吗? - Devesh
是的,但是有没有更好的方法来解决这个问题,我的整个项目中有许多类似的情况。 - Prasanth Kumar Vinakota
方法 GetDBMaster() 内部发生了什么,为什么不将 MatchingSkills 作为查询填充数据表的条件之一? - sujith karivelil
GetDBMaster从一个静态数据表变量中获取skillmaster,该变量在第一个用户向我的页面发出请求时仅从数据库加载一次。因此它具有完整的主数据,我正在尝试在这里筛选行。 - Prasanth Kumar Vinakota
3个回答

5
假设该列是 SkillName
List<DataRow> removeRows = dt.AsEnumerable()
    .Where(r => MatchingSkills.Contains(r.Field<string>("SkillName")))
    .ToList();
removeRows.ForEach(dt.Rows.Remove);

顺便说一下:我会使用一个HashSet<string>,因为它更有效率:

var MatchingSkills = new HashSet<string>(EnteredSkills.Select(c => c.Text));

2
最简单的方法是:
var lstRemoveColumns = new List<string>() { "ColValue1", "ColVal2", "ColValue3", "ColValue4" };
List<DataRow> rowsToDelete = new List<DataRow>();

foreach (DataRow row in dt.Rows) 
{
    if (lstRemoveColumns.Contains(row["ColumnName"].ToString())) 
    {
        rowsToDelete.Add(row);
    }
}

foreach (DataRow row in rowsToDelete) 
{
    dt.Rows.Remove(row);
}

dt.AcceptChanges();

Look here


0

这个解决方案非常好!我正在使用它来解决我的问题。

List<DataRow> lsFilteredData = dtUnfilteredData.AsEnumerable().Where(q => lsWhatIWanted.Contains(q.Field<string>("Code"))).ToList();

foreach (DataRow drFilteredData in lsFilteredData)
{
    //Do whatever you want here
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接