【问题标题】:How can I make DataTable enumerable?如何使 DataTable 可枚举?
【发布时间】:2010-11-05 17:32:58
【问题描述】:

我不能在 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,但有编译错误。

【问题讨论】:

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


    【解决方案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 的方法仅在可枚举对象上可用
    • 我认为这个想法是不使用 LINQ(因此需要 .NET Framework 2.0)。
    【解决方案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);
    

    【讨论】:

    • Select 在 .Rows 上不可用,无论是来自 2.0 框架还是 3.5 框架
    【解决方案3】:
        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】:
    1. IEnumerable&lt;DataRow&gt; rows = dataTable.AsEnumerable(); (System.Data.DataSetExtensions.dll)
    2. IEnumerable&lt;DataRow&gt; rows = dataTable.Rows.OfType&lt;DataRow&gt;(); (System.Core.dll)

    【讨论】:

      猜你喜欢
      • 2012-09-22
      • 1970-01-01
      • 2014-07-04
      • 2010-12-22
      • 1970-01-01
      • 1970-01-01
      • 2010-09-11
      相关资源
      最近更新 更多