如何使 DataTable 可枚举?
Posted
技术标签:
【中文标题】如何使 DataTable 可枚举?【英文标题】:How can I make DataTable enumerable? 【发布时间】: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,但有编译错误。
【问题讨论】:
【参考方案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);
【讨论】:
你的回答迫使我在 IEnumerable 上挖掘北斗^_^ 我用谷歌搜索了它,我发现这个developerfusion.com/article/9397/… 真的很有启发性【参考方案4】:IEnumerable<DataRow> rows = dataTable.AsEnumerable();
(System.Data.DataSetExtensions.dll)
IEnumerable<DataRow> rows = dataTable.Rows.OfType<DataRow>();
(System.Core.dll)
【讨论】:
以上是关于如何使 DataTable 可枚举?的主要内容,如果未能解决你的问题,请参考以下文章
在 onblur 期间始终从可编辑的 DataTable 中检索旧值(但不是新值)
如何根据条件使primefaces datatable列可编辑
如何在PrimeFaces中找出DataTable是否处于行编辑状态?