且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

如何从两个数据表中提取匹配的名称,并使用C#添加第三个数据表

更新时间:2023-01-31 12:09:13

您好,

我尝试了您的代码,它运行正常。

尝试这样的方式.. 。

 Console.WriteLine(-------- First Table DataRows -----------); 

DataTable dt1 = new DataTable();
dt1.Columns.Add(EmailId);

dt1.Rows.Add(deepthi @ gmail.com,divya @ gmail.com,indra @ gmail.com,lavanya @ gmail.com);
dt1.Rows.Add(test @ gmail.com,test1 @ gmail.com,test2 @ gmail.com);
dt1.AcceptChanges();



现在将这个逗号分隔的行转换为列

 int previousLength = dt1.Rows.Count; //最初将行数保存到变量

for(int i = 0; i< previousLength; i ++)
{
//首先,获取您的分割值。
string [] vals = dt1.Rows [i] [0] .ToString()。Split(',');

//仅对分成多个行的行进行操作。
if(vals.Length> 1)
{
//为从值字符串解析的每个项目添加新行
foreach(字符串s in vals)
{
DataRow newRow = dt1.NewRow();
newRow [0] = s;
dt1.Rows.Add(newRow);
}
}
}


//删除旧行
for(int i = 0; i< previousLength; i ++)
{
dt1.Rows.RemoveAt(0);
}

//保存更改
dt1.AcceptChanges();





现在添加第二个DataTable

 Console.WriteLine(\ n ---------- Second Table DataRows ---------- ); 

DataTable dt2 = new DataTable();
dt2.Columns.Add(EmailId);

dt2.Rows.Add(deepthi@gmail.com);
dt2.Rows.Add(test1@gmail.com);
dt2.AcceptChanges();



制作一个新的数据表来存储上面两张表中的匹配项目



 DataTable dt3 = new DataTable(); 
dt3.Columns.Add(EmailId);
foreach(dt2.Rows中的DataRow row1)
{
foreach(dt1.Rows中的DataRow row2)
{
if(row1 [EmailId]。ToString ()== row2 [EmailId]。ToString())
{
dt3.ImportRow(row2);
dt3.AcceptChanges();
}
}
}



,输出结果如下:

 ---匹配项目的输出---- 
deepthi@gmail.com
test1@gmail.com



谢谢


至少有几种方法可以实现这一目标。我是Linq的粉丝,所以我建议使用Linq查询...



 DataTable dt1 = new DataTable() ; 
dt1.Columns.Add(new DataColumn(registeredmails,typeof(string)));
dt1.Rows.Add(new object [] {deepthi @ gmail.com,divya @ gmail.com,indra @ gmail.com,lavanya @ gmail.com});
dt1.Rows.Add(new object [] {lanadelray @ gmail.com,digimanus @ gmail.com,overflow @ gmail.com,lennykravitz @ gmail.com});
dt1.Rows.Add(new object [] {gretavanfleet @ gmail.com,direstraits @ gmail.com,johnydeep @ gmail.com,sia @ gmail.com});

DataTable dt2 = new DataTable();
dt2.Columns.Add(new DataColumn(loggedmails,typeof(string)));
dt2.Rows.Add(new object [] {divya@gmail.com});
dt2.Rows.Add(new object [] {sia@gmail.com});

DataTable dtTemp = new DataTable();
dtTemp.Columns.Add(new DataColumn(mail,typeof(string)));


dtTemp = dt1.AsEnumerable()
.SelectMany(x => x.Field< string>(registeredmails)。Split(new string [] { ,},StringSplitOptions.RemoveEmptyEntries))//通过分隔符拆分邮件
.Where(m => dt2.AsEnumerable()。任意(d => d.Field< string>(loggedmails)= = m))//得到相等的数据
。选择(t => dtTemp.LoadDataRow(new object [] {t},false))//转换IEnumerable< string>到DataRow
.CopyToDataTable()的集合; //将数据复制到最终的DataTable

// dtTemp包含相等的数据(邮件):
//divya@gmail.com
//sia@gmail.com





详情请见:

LINQ:.NET语言集成查询 [ ^ ]


In my application i have two datatables where i will be getting mailds in the first data table and i will be getting the mail id of thwe user who has logged in into the application in second datatable.Now i need to compare the email which i am getting in second datatable and add that email id in third datatable only if it matches with first datatable.The problem is in my first datatable i am getting a row with values as deepthi@gmail.com,divya@gmail.com,indra@gmail.com,lavanya@gmail.com and in my second datatable i will get only one mail id that is the mail id of the user who has logged in into the application let us suppose it is divya@gmail.com now i need to compare these two datatables and add the matching email id into third datatable how can i do this

<pre lang="c#">DataTable dtusercheck = adm.checkvalidusersornot(ddl1.SelectedValue);
     string value = username.Replace(" ", string.Empty);
     DataTable dtuserinprojectornot = adm.checkuserisinprojectornot(value);
     DataTable dt3 = dtuserinprojectornot.Clone();
     foreach (DataRow row1 in dtusercheck.Rows)
     {
         foreach (DataRow row2 in dtuserinprojectornot.Rows)
         {
             if (row1["id"].ToString() == row2["id"].ToString())
             {
                 dt3.ImportRow(row2);
             }
         }
     }
     if (dt3.Rows.Count > 0)
     {
         lblErrMsg.Visible = true;
     }
     else
     {
         lblErrMsg.Visible = true;
     }



What I have tried:

i tried above code but the problem with my code is i am getting the email id's seperated by commas in first datatable how can i seperate them after commas and how can i compare two datatables after seperating with commas

Hello ,
I tried your code and it works fine.
Try like this way ...
Console.WriteLine("--------First Table DataRows-----------");
		
		DataTable dt1=new DataTable();
		dt1.Columns.Add("EmailId");
		
          dt1.Rows.Add("deepthi@gmail.com,divya@gmail.com,indra@gmail.com,lavanya@gmail.com");
		dt1.Rows.Add("test@gmail.com,test1@gmail.com,test2@gmail.com");
		dt1.AcceptChanges();


Now convert this comma separated rows into columns

int previousLength=dt1.Rows.Count;//Initially keep the number of rows into a variable
		
		for (int i = 0; i < previousLength; i++)
        {
            //First, get your split values.
            string[] vals = dt1.Rows[i][0].ToString().Split(',');

            //only operate on rows that were split into multiples.
            if (vals.Length > 1)
            {
                //Add a  new row for each item parsed from value string
                foreach (string s in vals)
                {
                    DataRow newRow = dt1.NewRow();                   
                    newRow[0] = s;
                    dt1.Rows.Add(newRow);
                }
            }
        }

					
		//Remove old rows
        for (int i = 0; i < previousLength; i++)
        {
            dt1.Rows.RemoveAt(0);
        }
		
		//Save the changes
		dt1.AcceptChanges();



Now adding second DataTable

Console.WriteLine("\n----------Second Table DataRows ----------");
		
		DataTable dt2 = new DataTable();
		dt2.Columns.Add("EmailId");
		
		dt2.Rows.Add("deepthi@gmail.com");
		dt2.Rows.Add("test1@gmail.com");
		dt2.AcceptChanges();


Make a new datatable to store the match items from above said two tables

DataTable dt3=new DataTable();
		dt3.Columns.Add("EmailId");
		foreach (DataRow row1 in dt2.Rows)
     	{
         foreach (DataRow row2 in dt1.Rows)
         {
             if (row1["EmailId"].ToString() == row2["EmailId"].ToString())
             {
                 dt3.ImportRow(row2);
				 dt3.AcceptChanges();
             }
         }
   	  }


and the out put is given below

---Out put of matching items----
deepthi@gmail.com
test1@gmail.com


Thanks


There's at least few ways to achieve that. I'm a fan of Linq, so i'd suggest to use Linq queries...

DataTable dt1 = new DataTable();
dt1.Columns.Add(new DataColumn("registeredmails", typeof(string)));
dt1.Rows.Add(new object[]{"deepthi@gmail.com,divya@gmail.com,indra@gmail.com,lavanya@gmail.com"});
dt1.Rows.Add(new object[]{"lanadelray@gmail.com,digimanus@gmail.com,overflow@gmail.com,lennykravitz@gmail.com"});
dt1.Rows.Add(new object[]{"gretavanfleet@gmail.com,direstraits@gmail.com,johnydeep@gmail.com,sia@gmail.com"});

DataTable dt2 = new DataTable();
dt2.Columns.Add(new DataColumn("loggedmails", typeof(string)));
dt2.Rows.Add(new object[]{"divya@gmail.com"});
dt2.Rows.Add(new object[]{"sia@gmail.com"});

DataTable dtTemp = new DataTable();
dtTemp.Columns.Add(new DataColumn("mail", typeof(string)));


dtTemp = dt1.AsEnumerable()
	.SelectMany(x=>x.Field<string>("registeredmails").Split(new string[]{","}, StringSplitOptions.RemoveEmptyEntries)) //split mails by delimiter
	.Where(m=> dt2.AsEnumerable().Any(d=>d.Field<string>("loggedmails")==m)) //get equal data
	.Select(t=> dtTemp.LoadDataRow(new object[]{t}, false)) //convert IEnumerable<string> into set of DataRow
	.CopyToDataTable(); //copy data into final DataTable
	
//dtTemp contains equal data (mails):
//divya@gmail.com 
//sia@gmail.com 



For further details, please see:
LINQ: .NET Language Integrated Query[^]