У меня есть a List<string>
и у меня есть DataTable.
Один из столбцов в DataRow является идентификатором. Список содержит экземпляры этого идентификатора.
DataTable заполняется на Таймере.
Я хочу возвратить объекты из Списка, которые не находятся в DataTable в другой список.
Вы захотите сделать что-то подобное
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.
.Если ваша таблица была чем-то вроде этой:
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();
С разумной эффективностью с помощью 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();