6

我不能在 DataTable 上使用 AsEnumerable(),我使用的是 C# 3,但我只是针对 2.0 框架(LINQ 功能由LINQBridge提供)。有什么方法可以在不使用 Select() 的情况下使 DataTable 可枚举?

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);

我知道 DataTable 的 Select 方法返回一个副本,我想只使用 AsEnumerable,问题是我只是针对 2.0 框架,System.Data.DataSetExtensions 不可用

顺便说一句,我试过这个:http ://cs.rthand.com/blogs/blog_with_righthand/archive/2006/01/15/284.aspx ,但有编译错误。

4

4 回答 4

13
    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);
于 2009-06-25T03:11:56.057 回答
5
  1. IEnumerable<DataRow> rows = dataTable.AsEnumerable();(System.Data.DataSetExtensions.dll)
  2. IEnumerable<DataRow> rows = dataTable.Rows.OfType<DataRow>();(System.Core.dll)
于 2011-03-14T12:15:05.987 回答
2

严格保持您的枚举器 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);
于 2009-06-25T03:04:08.057 回答
1

您可以尝试将 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 将遍历列表并搜索文件名(我假设您正在搜索具有该文件名的第一个 DataRow,而不是与文件名匹配的所有行)。

于 2009-06-25T03:03:46.527 回答