【问题标题】:How to remove one datatable rows based on another datatable in .net?如何根据.net中的另一个数据表删除一个数据表行?
【发布时间】:2016-10-22 14:03:35
【问题描述】:

我有一张名为dtFirst的数据表,如下图

Fieldname              Newvalue

antenastructure        12
slno                   2
servicelevel
powersupply

另一个数据表为dtMaster

Mastertabe          Masterfield          infoid      zvalue     qvalue

M_seq               antenastructure       123          
M_seq               slno                  1      
M_seq               servicelevel          133
M_seq               powersupply           154
M_seq               azimheight            124

我想要的是我想从dtMaster 中删除行,如果dtFirstFieldname 不包含Newvalue 即这里我想删除包含servicelevelpowersupply 的行。这两个是我在其中发布一小部分的大数据表

【问题讨论】:

  • 来吧,这很简单——你应该可以自己编写代码——向我们展示你到目前为止的努力吗?只需在 dtFirst 上执行 Rows.Select 即可获取没有 NewValues 的项目,然后遍历 dtMaster 删除 dtFirst 中没有值的行。
  • 我使用了链接codeproject.com/Questions/686406/…中提到的逻辑,但没有一个成功

标签: c# asp.net .net datatable


【解决方案1】:

看看这是否有效

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            DataTable dtFirst = new DataTable();
            dtFirst.Columns.Add("Fieldname", typeof(string));
            dtFirst.Columns.Add("Newvalue", typeof(int));
            dtFirst.Columns["Newvalue"].AllowDBNull = true;

            dtFirst.Rows.Add(new object[] {"antenastructure", 12});
            dtFirst.Rows.Add(new object[] {"slno", 2});
            dtFirst.Rows.Add(new object[] {"servicelevel"});
            dtFirst.Rows.Add(new object[] {"powersupply"});

            string[] dtFirstValidRows = dtFirst.AsEnumerable().Where(x => x.Field<int?>("Newvalue") != null).Select(x => x.Field<string>("Fieldname")).ToArray();

            DataTable dtMaster = new DataTable();
            dtMaster.Columns.Add("Mastertabe", typeof(string));
            dtMaster.Columns.Add("Masterfield", typeof(string));
            dtMaster.Columns.Add("infoid", typeof(int));
            dtMaster.Columns["infoid"].AllowDBNull = true;
            dtMaster.Columns.Add("zvalue", typeof(int));
            dtMaster.Columns["zvalue"].AllowDBNull = true;
            dtMaster.Columns.Add("qvalue", typeof(int));
            dtMaster.Columns["qvalue"].AllowDBNull = true;

            dtMaster.Rows.Add(new object[] {"M_seq", "antenastructure", 123});          
            dtMaster.Rows.Add(new object[] {"M_seq", "slno", 1});          
            dtMaster.Rows.Add(new object[] {"M_seq", "servicelevel", 133});          
            dtMaster.Rows.Add(new object[] {"M_seq", "powersupply", 154});          
            dtMaster.Rows.Add(new object[] {"M_seq", "azimheight", 124});

            dtMaster = dtMaster.AsEnumerable().Where(x => dtFirstValidRows.Contains(x.Field<string>("Masterfield"))).CopyToDataTable();
        }
    }
}

【讨论】:

    【解决方案2】:

    这是在我的手机上输入的伪代码:

    var rowsWithoutVals = dtFirst.Rows.Select("newValues = ''");
    
    for(int i = dtMaster.Rows.Count - 1; i > -1;i--) {
    
     foreach (var emptyItem in rowsWithoutVals) {
      if (emptyItem[0] == dtMaster[i][1]) {
        dtMaster.Rows.RemoveAt[i];
        break;
       }
     }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-16
      • 1970-01-01
      • 1970-01-01
      • 2010-12-19
      • 1970-01-01
      • 2010-12-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多