Вопрос

Я не могу использовать 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);

Другие советы

  1. IEnumerable<DataRow> rows = dataTable.AsEnumerable(); (System.Data.DataSetExtensions.dll)
  2. 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 будет перебирать список и искать имя файла (я предполагаю, что вы ищете первую строку данных с этим именем файла, а не все строки, соответствующие имени файла).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top