kav@94 Ответов: 2

Как извлечь соответствующие имена из двух DataTable и добавить в третий объект DataTable с использованием C#


В моем приложении у меня есть две таблицы данных, где я буду получать mailds в первой таблице данных, и я буду получать почтовый идентификатор пользователя, который вошел в приложение во второй таблице данных.Теперь мне нужно сравнить электронную почту, которую я получаю во втором datatable и добавить этот идентификатор электронной почты в третьем datatable только в том случае, если он совпадает с первым datatable.Проблема в том, что в моем первом datatable я получаю строку со значениями as deepthi@gmail.com,divya@gmail.com,indra@gmail.com,lavanya@gmail.com и в моем втором datatable я получу только один почтовый идентификатор то есть почтовый идентификатор пользователя который вошел в приложение предположим это так divya@gmail.com теперь мне нужно сравнить эти две таблицы данных и добавить соответствующий идентификатор электронной почты в третью таблицу данных как я могу это сделать

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


Что я уже пробовал:

я попробовал выше код но проблема с моим кодом заключается в том что я получаю идентификатор электронной почты разделенный запятыми в первом datatable как я могу отделить их после запятых и как я могу сравнить две таблицы данных после разделения запятыми

2 Ответов

Рейтинг:
2

Maciej Los

Есть, по крайней мере, несколько способов достичь этого. Я поклонник 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)) //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 


Для получения более подробной информации, пожалуйста, смотрите:
LINQ, которая: .Объем встроенного языка запросов[^]


kav@94

Я пытаюсь ввести метод и остановить выполнение следующих строк моего кода, если он переходит в состояние else моего нижеприведенного метода с помощью ключевого слова return, но он все еще выполняет следующие строки моего кода после перехода в состояние else.Как я могу остановить выполнение следующих строк кода после перехода в состояние else

пользователи общественного недействительными ()
{
DataTable dt = новый DataTable();
ДТ.колонны.Добавить(новый datacolumn("идентификатор", используется typeof(строка)));
dt.Rows.Add("test1@test.com,test2@test.com,test3@test.com");
dt.Rows.Add("test4@test.com,test5@test.com,test6@test.com");
dt.Rows.Add("test7@test.com,test8@test.com,test9@test.com");
DataTable dtusercheck = dt;

DataTable dt2 = новый DataTable();
dt2.столбцы.Добавить(новый datacolumn("идентификатор", используется typeof(строка)));
dt2.Rows.Add("test3@test.com");
DataTable dtuserinprojectornot = dt2;
DataTable dt3 = dtuserinprojectornot.Клон();

foreach (DataRow row1 в dtusercheck.Строки)
{
foreach (DataRow row2 в dtuserinprojectornot.Rows)
{
foreach (строка emailId в строке 1["id"].Метод toString().Сплит(','))
{
if (emailId == row2["id"].Метод toString())
{
Ст3.Метод importrow(для row2);
}
}
}
}
если (Ст3.Строк.Count > 0)
{
lblErrMsg.Видимое = истинное;
}
еще
{
lblErrMsg.Видимое = истинное;
вернуть;
}
}

Рейтинг:
1

Animesh Datta

Привет ,
Я попробовал ваш код, и он отлично работает.
Попробуй вот так ...

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


Теперь добавим второй 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 для хранения совпадающих элементов из указанных выше двух таблиц

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

а out put приведен ниже
---Out put of matching items----
deepthi@gmail.com
test1@gmail.com

Спасибо


Animesh Datta

После добавления/удаления строк в таблице данных необходимо сохранить изменения
на ст1.Метод acceptchanges()

kav@94

Я пытаюсь ввести метод и остановить выполнение следующих строк моего кода, если он переходит в состояние else моего нижеприведенного метода с помощью ключевого слова return, но он все еще выполняет следующие строки моего кода после перехода в состояние else.Как я могу остановить выполнение следующих строк кода после перехода в состояние else

пользователи общественного недействительными ()
{
DataTable dt = новый DataTable();
ДТ.колонны.Добавить(новый datacolumn("идентификатор", используется typeof(строка)));
dt.Rows.Add("test1@test.com,test2@test.com,test3@test.com");
dt.Rows.Add("test4@test.com,test5@test.com,test6@test.com");
dt.Rows.Add("test7@test.com,test8@test.com,test9@test.com");
DataTable dtusercheck = dt;

DataTable dt2 = новый DataTable();
dt2.столбцы.Добавить(новый datacolumn("идентификатор", используется typeof(строка)));
dt2.Rows.Add("test3@test.com");
DataTable dtuserinprojectornot = dt2;
DataTable dt3 = dtuserinprojectornot.Клон();

foreach (DataRow row1 в dtusercheck.Строки)
{
foreach (DataRow row2 в dtuserinprojectornot.Rows)
{
foreach (строка emailId в строке 1["id"].Метод toString().Сплит(','))
{
if (emailId == row2["id"].Метод toString())
{
Ст3.Метод importrow(для row2);
}
}
}
}
если (Ст3.Строк.Count > 0)
{
lblErrMsg.Видимое = истинное;
}
еще
{
lblErrMsg.Видимое = истинное;
вернуть;
}
}