更新时间: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();
现在添加第二个DataTableConsole.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 columnsint 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 DataTableConsole.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 tablesDataTable 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[^]