【问题标题】:Remove rows from datatable matching a List<string>从与 List<string> 匹配的数据表中删除行
【发布时间】:2019-02-19 15:17:24
【问题描述】:

我有一个 DataTable,我想删除与 List&lt; string&gt; 匹配的所有行,该怎么做?以下是我的代码,

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;
    }

【问题讨论】:

  • 你不能简单地循环检查匹配的行并将其从数据表中删除吗?
  • 是的,但是有没有更好的方法来做到这一点,在我整个项目中有很多这样的情况。
  • 方法GetDBMaster() 内部发生了什么,为什么不在填充数据表的查询中包含MatchingSkills 作为条件?
  • GetDBMaster 从静态数据表变量中提供技能大师,当第一个用户向我的页面发出请求时,该变量仅从数据库加载一次。所以它有完整的主人,我试图在这里过滤来自那个主人的行。

标签: c# asp.net linq


【解决方案1】:

假设列是SkillName

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

旁注:我会使用HashSet&lt;string&gt;,因为它会更有效:

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();
    

    here

    【讨论】:

      【解决方案3】:

      这个解决方案效果很好!我将它用于我的解决方案。

      List<DataRow> lsFilteredData = dtUnfilteredData.AsEnumerable().Where(q => lsWhatIWanted.Contains(q.Field<string>("Code"))).ToList();
      
      foreach (DataRow drFilteredData in lsFilteredData)
      {
          //Do whatever you want here
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-14
        • 1970-01-01
        • 2011-10-02
        • 1970-01-01
        • 1970-01-01
        • 2019-02-14
        • 1970-01-01
        • 2010-12-20
        相关资源
        最近更新 更多