我无法在 DataTable 上使用 AsEnumerable(),我使用的是 C# 3,但我只是针对 2.0 框架(LINQ 功能由 LINQ桥)。有什么方法可以在不使用 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, ,但有编译错误。

有帮助吗?

解决方案

    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(); (系统.Data.DataSetExtensions.dll)
  2. IEnumerable<DataRow> rows = dataTable.Rows.OfType<DataRow>(); (系统.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将通过列表和搜索文件名的迭代(我假设你正在寻找与文件名,不匹配文件名的所有行第一的DataRow)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top