如何从两个数据表中提取匹配的名称,并使用C#添加第三个数据表 [英] How to extract the matching names from two datatable and add in third datatable using C#

查看:70
本文介绍了如何从两个数据表中提取匹配的名称,并使用C#添加第三个数据表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的应用程序中,我有两个数据表,我将在第一个数据表中获取mailds,我将获得已登录到第二个数据表中的应用程序的用户的邮件ID。现在我需要比较电子邮件我在第二个数据表中获取并在第三个数据表中添加该电子邮件ID,只有它与第一个数据表匹配。问题出在我的第一个数据表中,我得到的行的值为 deepthi@gmail.com, divya @ gmail.com,indra @ gmail.com,lavanya @ gmail.com 并且在我的第二个数据表中,我将只获得一个邮件ID,即登录到用户的用户的邮件ID应用程序让我们假设它是 divya@gmail.com 现在我需要比较这两个数据表并将匹配的电子邮件ID添加到第三个数据表我该怎么做呢



< 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(dtusercheck.Rows中的DataRow row1)
{
foreach(dtuserinprojectornot.Rows中的DataRow row2)
{
if(row1 [id]。ToString ()== row2 [id]。ToString())
{
dt3.ImportRow(row2);
}
}
}
if(dt3.Rows.Count> 0)
{
lblErrMsg.Visible = true;
}
其他
{
lblErrMsg.Visible = true;
}





我尝试过:



i尝试上面的代码,但我的代码的问题是我在第一个数据表中用逗号分隔电子邮件ID如何在逗号后分隔它们如何在用逗号分隔后比较两个数据表

解决方案

您好,

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

尝试这样的方式.. 。

 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[^]


这篇关于如何从两个数据表中提取匹配的名称,并使用C#添加第三个数据表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆