如何使 DataTable 可枚举?
-
22-07-2019 - |
题
我无法在 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);
其他提示
IEnumerable<DataRow> rows = dataTable.AsEnumerable();
(系统.Data.DataSetExtensions.dll)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)。
不隶属于 StackOverflow