2009-06-25 87 views
4

我不能在DataTable上使用AsEnumerable(),我使用的是C#3,但我只是針對2.0框架(LINQ功能由LINQBridge提供)。有沒有什麼辦法可以使DataTable枚舉而不使用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的選擇方法返回一個副本的端倪,我想只是使用AsEnumerable,問題是我只是針對2.0框架,System.Data.DataSetExtensions不可用

順便說一句,我試過這個:http://cs.rthand.com/blogs/blog_with_righthand/archive/2006/01/15/284.aspx,但有compila錯誤。

回答

11
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

您可以嘗試鑄造的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文件名,而不是所有匹配文件名的行)。

+0

IListSource.GetList()不映射到LINQ的任何擴展方法。 LINQ的方法僅在枚舉數上可用 – Hao 2009-06-25 03:10:13

+0

我認爲這個想法是不使用LINQ(因此.NET Framework 2.0的要求)。 – 2009-06-25 03:49:22

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); 
+0

選擇不可用.Rows,無論是從2.0框架還是3.5框架 – Hao 2009-06-25 03:15:18

4
  1. IEnumerable<DataRow> rows = dataTable.AsEnumerable();(System.Data.DataSetExtensions.dll)
  2. IEnumerable<DataRow> rows = dataTable.Rows.OfType<DataRow>();(System.Core.dll)