我不能在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不可用
BTW,我试过这个:http://cs.rthand.com/blogs/blog_with_righthand/archive/2006/01/15/284.aspx,但有编译错误。
答案 0 :(得分:12)
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 :(得分:4)
IEnumerable<DataRow> rows = dataTable.AsEnumerable();
(System.Data.DataSetExtensions.dll)IEnumerable<DataRow> rows = dataTable.Rows.OfType<DataRow>();
(System.Core.dll)答案 2 :(得分: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);
答案 3 :(得分: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,而不是所有与文件名匹配的行)。