Как сделать DataTable перечислимой? - PullRequest
4 голосов
/ 25 июня 2009

Я не могу использовать AsEnumerable () в DataTable, я использую C # 3, но я просто нацеливаюсь на 2.0 framework (возможность 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 framework, System.Data.DataSetExtensions недоступен

Кстати, я пробовал это: http://cs.rthand.com/blogs/blog_with_righthand/archive/2006/01/15/284.aspx,, но есть ошибки компиляции.

Ответы [ 4 ]

12 голосов
/ 25 июня 2009
    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);
4 голосов
/ 14 марта 2011
  1. IEnumerable<DataRow> rows = dataTable.AsEnumerable(); (System.Data.DataSetExtensions.dll)
  2. IEnumerable<DataRow> rows = dataTable.Rows.OfType<DataRow>(); (System.Core.dll)
2 голосов
/ 25 июня 2009

Строго придерживайтесь своего счетчика 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);
1 голос
/ 25 июня 2009

Вы можете попробовать привести 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 будет перебирать список и искать имя файла (я предполагаю, что вы ищете первую строку данных с этим именем, а не все строки, соответствующие имени файла).

...