Сравните две таблицы данных для различий и добавьте столбец соответственно - PullRequest
0 голосов
/ 24 мая 2018

У меня есть две DataTable A и B, с идентификаторами столбцов, Receipt и Amount в обоих.

Мне нужно отобразить результат в GridView, но у него будет еще один столбец с именем «Issued».Теперь я создал еще один пустой объект DataTable.

Мне нужно сравнить A с B таким образом, чтобы, если «ID» для A был доступен в «ID» для B, мне нужно добавить еще один столбец вэта строка, называемая «Выдано» как «Да» в А. Если нет, то «Выдано» будет «Нет».

Я читал о сравнении с использованием Linq, но не знаю, как добавитьновый столбец.

Ответы [ 3 ]

0 голосов
/ 24 мая 2018
tableA.Columns.Add("Issued"); 

// the join assumes your ID field is of type int. Change type/names as appropriate
var query = from rowA in tableA.AsEnumerable()
            join rowB in tableB.AsEnumerable() 
            on rowA.Field<int>("ID") equals rowB.Field<int>("ID") into grp 
            from B in grp.DefaultIfEmpty()
            select new { A = rowA, B }; 

foreach (var pair in query)
{
    if (pair.B != null)
        pair.A["Issued"] = "Yes"; 
    else
        pair.A["Issued"] = "No";
}

Это сопоставление также может быть выполнено без Linq со старомодным циклом.

var idsInB = new HashSet<int>();
foreach (DataRow row in tableB.Rows)
    idsInB.Add((int)row["ID"]);

foreach (DataRow row in tableA.Rows)
{
    if (idsInB.Contains((int)row["ID"]))
        row["Issued"] = "Yes";
    else
        row["Issued"] = "No";
}
0 голосов
/ 24 мая 2018

Выполнить левое соединение

List<C> ListC=(from B in ListB
               join A in ListA
               on B.Id equals A.Id
               into tempList
               from temp in TempList.DefaultIfEmpty()
               select new{B,temp})
              .Select(x=>new C
                {
                  x.B.Id, 
                  x.B.Receipt,
                  x.B.Amount,
                  Issued=x.temp==null?"No":"Yes"
                 }.ToList();

Так что C будет содержать все записи B вместе с вашим дополнительным столбцом Issued.Вы можете сделать еще одну вещь, вы можете иметь дополнительное поле в классе B и установить его значение.Вам не нужно будет создавать дополнительный класс C.

class B{
 int id{get;set;}
 int Receipt{get;set;}
 int Amount{get;set;}
 string Issued{get;set;}
}
0 голосов
/ 24 мая 2018

Я попытался смоделировать сценарий, который вы задали, и разработал простую консольную программу.Я надеюсь, что это поможет вам.

static void Main(string[] args)
{
    DataTable dtA = new DataTable();
    dtA.Columns.Add("ID");
    dtA.Columns.Add("Receipt");
    dtA.Columns.Add("Amount");
    dtA.Columns.Add("Issued");

    DataTable dtB = new DataTable();
    dtB.Columns.Add("ID");
    dtB.Columns.Add("Receipt");
    dtB.Columns.Add("Amount");

    for (int i = 1; i <= 10; i++)
        dtA.Rows.Add(i, "Receipt" + i, i * 10, "");

    for (int i = 1; i <= 5; i++)
        dtB.Rows.Add(i, "Receipt" + i, i * 10);

    for (int i = 0; i < dtA.Rows.Count; i++)
    {
        for (int j = 0; j < dtB.Rows.Count; j++)
        {
            if (Convert.ToInt32(dtA.Rows[i]["ID"]) == Convert.ToInt32(dtB.Rows[j]["ID"]))
                dtA.Rows[i]["Issued"] = "Yes";
        }
    }

    Console.ReadLine();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...