質問

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 ですが、コンパイルエラーがあります。

役に立ちましたか?

解決

    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. IEnumerable<DataRow> rows = dataTable.AsEnumerable();(System.Data.DataSetExtensions.dll)
  2. IEnumerable<DataRow> rows = dataTable.Rows.OfType<DataRow>();(System.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を検索していると仮定します)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top