Сравните набор DataRow для Списка <T>

У меня есть a List<string> и у меня есть DataTable.

Один из столбцов в DataRow является идентификатором. Список содержит экземпляры этого идентификатора.

DataTable заполняется на Таймере.

Я хочу возвратить объекты из Списка, которые не находятся в DataTable в другой список.

5
задан Jon 5 January 2010 в 11:19
поделиться

3 ответа

Вы захотите сделать что-то подобное

var tableIds = table.Rows.Cast<DataRow>().Select(row => row["ID"].ToString());

var listIds = new List<string> {"1", "2", "3"};

return listIds.Except(tableIds).ToList();

Вы можете привести строки в таблице данных к IEnumerable коллекции, а затем выбрать значение столбца "ID" из каждой из них. Затем вы можете использовать метод Enumerable.Except extension для получения всех значений из списка, которые не входят в только что созданную вами коллекцию.

Если вам нужно получить значения, которые находятся в таблице, но не в списке, просто переверните listIds и tableIds.

.
13
ответ дан 18 December 2019 в 11:57
поделиться

Если ваша таблица была чем-то вроде этой:

DataTable dt = new DataTable();
dt.Columns.Add("ID");
DataRow dr = dt.NewRow();
dt.PrimaryKey = new DataColumn[] {dt.Columns[0]};
dr["ID"] = "1";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["ID"] = "2";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["ID"] = "3";
dt.Rows.Add(dr);

и список был чем-то вроде этой:

DataTable dt = new DataTable();
dt.Columns.Add("ID");
DataRow dr = dt.NewRow();
dt.PrimaryKey = new DataColumn[] {dt.Columns[0]};
dr["ID"] = "1";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["ID"] = "2";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["ID"] = "3";
dt.Rows.Add(dr);

:

List<string> ls = new List<string>{"1","2","4"};

мы могли бы получить элементы, найденные в списке, а не в датируемом виде:

var v = from r in ls
                where !dt.Rows.Contains(r)
                select r;
        v.ToList();
1
ответ дан 18 December 2019 в 11:57
поделиться

С разумной эффективностью с помощью HashSet (и отметив, что самый быстрый способ получения данных из DataRow - это с помощью индексатора DataColumn):

        HashSet<int> ids = new HashSet<int>();
        DataColumn col = table.Columns["ID"];
        foreach (DataRow row in table.Rows)
        {
            ids.Add((int)row[col]);
        }
        var missing = list.Where(item => !ids.Contains(item.ID)).ToList();
1
ответ дан 18 December 2019 в 11:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: