如何使DataTable可枚举?

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个回答

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

你的回答促使我更深入地了解IEnumerable ^_^ 我谷歌了一下,发现这篇文章http://www.developerfusion.com/article/9397/iterator-blocks-in-c-2-autogenerated-state-machines/真的很有启发性。 - Hao

5
  1. IEnumerable<DataRow> rows = dataTable.AsEnumerable(); (System.Data.DataSetExtensions.dll)
  2. IEnumerable<DataRow> rows = dataTable.Rows.OfType<DataRow>(); (System.Core.dll)
这两行代码都可以用于获取DataTable中的所有数据行。第一行代码使用了DataSetExtensions.dll库中的AsEnumerable()方法,而第二行代码则使用了Core.dll库中的OfType()方法。

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

无论是2.0框架还是3.5框架,.Rows上不可用Select。 - Hao

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,而不是所有匹配文件名的行)。

IListSource.GetList() 不对应 LINQ 的 Any 扩展方法。LINQ 的方法仅适用于可枚举对象。 - Hao
我认为这个想法是不使用LINQ(因此需要.NET Framework 2.0)。 - Chris Thompson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接