Как сделать DataTable перечислимым?
-
22-07-2019 - |
Вопрос
Я не могу использовать AsEnumerable() в DataTable, я использую C# 3, но я просто нацелен на платформу 2.0 (возможность LINQ любезно предоставлена LINQBridge).Есть ли способ сделать DataTable перечислимым без использования Select() ?
bool isExisting = (bdsAttachments.DataSource as DataTable).Select().Any(xxx => (string)dr["filename"] == filename);
Обновлять:
Я хотел, чтобы это выглядело так:
bool isExisting = (bdsAttachments.DataSource as DataTable).AsEnumerable().Any(xxx => (string)dr["filename"] == filename);
У меня возникает подозрение, что метод Select DataTable возвращает копию, я думаю просто использовать AsEnumerable, проблема в том, что я просто ориентируюсь на платформу 2.0, System.Data.DataSetExtensions недоступна
Кстати, я попробовал это: http://cs.rthand.com/blogs/blog_with_righthand/archive/2006/01/15/284.aspx, но имеет ошибки компиляции.
Решение
public static IEnumerable<DataRow> EnumerateRows(this DataTable table)
{
foreach (var row in table.Rows)
{
yield return row;
}
}
Позволяет звонить:
bool isExisting = (bdsAttachments.DataSource as DataTable).EnumerateRows().Any(dr => (string)dr["filename"] == filename);
Другие советы
IEnumerable<DataRow> rows = dataTable.AsEnumerable();
(System.Data.DataSetExtensions.dll)IEnumerable<DataRow> rows = dataTable.Rows.OfType<DataRow>();
(System.Core.dll)
Сохранение вашего перечислителя строго 2.0:
public static IEnumerable<DataRow> getRows(DataTable table)
{
foreach (DataRow row in table.Rows)
{
yield return row;
}
}
Затем позвоните с помощью linqbridge следующим образом:
bool isExisting = getRows(bdsAttachments.DataSource as DataTable).Any(row => (string)row["filename"] == filename);
Вы можете попробовать преобразовать DataTable в IEnumerable и перебрать набор:
//your data exists as a DataTable
DataTable dt = (DataTable)bdsAttachments.DataSource;
foreach (DataRow row in dt)
{
if (row["filename"] == filename)
return row;
}
foreach будет перебирать список и искать имя файла (я предполагаю, что вы ищете первую строку данных с этим именем файла, а не все строки, соответствующие имени файла).