如何使DataTable可枚举?

时间:2009-06-25 02:55:01

标签: c# ado.net datatable .net-2.0 enumerable

我不能在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不可用

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

4 个答案:

答案 0 :(得分:12)

    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 :(得分:4)

  1. IEnumerable<DataRow> rows = dataTable.AsEnumerable();(System.Data.DataSetExtensions.dll)
  2. IEnumerable<DataRow> rows = dataTable.Rows.OfType<DataRow>();(System.Core.dll)

答案 2 :(得分: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);

答案 3 :(得分: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,而不是所有与文件名匹配的行)。