6

私は 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 を使用することを考えています。

ところで、私はこれを試しました: http://cs.rthand.com/blogs/blog_with_righthand/archive/2006/01/15/284.aspx、しかしコンパイルエラーがあります。

4

4 に答える 4

13
    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);
于 2009-06-25T03:11:56.057 に答える
5
  1. IEnumerable<DataRow> rows = dataTable.AsEnumerable();(System.Data.DataSetExtensions.dll)
  2. IEnumerable<DataRow> rows = dataTable.Rows.OfType<DataRow>();(System.Core.dll)
于 2011-03-14T12:15:05.987 に答える
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);
于 2009-06-25T03:04:08.057 に答える
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 を検索していると仮定します)。

于 2009-06-25T03:03:46.527 に答える