6

DataTableオブジェクトを反復処理するときに、それぞれのDataRowオブジェクトを汎用文字列List内の項目と照合する必要があります。

List の Find メソッドをデリゲートと共に使用するブログ投稿を見つけましたが、その例には別のクラス (Person) がありますが、文字列オブジェクトのインスタンスを使用して次のようなことを試みています。

// My definition of the List object.
List<string> lstAccountNumbers = new List<string>();
...

// I populate the List via its Add method.
...

foreach (DataRow drCurrentRow in dtMyDataTable.Rows) 
{
    if (lstAccounts.Find(delegate(string sAccountNumber) { return sAccountNumber == drCurrentRow["AccountNumber"]; })
    {
        Found_DoSomething();
    }
    else
    {
        NotFound_DoSomethingElse();
    }
}

ただし、この構文では、 ifブロックに対して「型 'string' を 'bool' に暗黙的に変換できません」というメッセージが表示されます。

誰かが私が間違っていることと、私がやろうとしていることを達成するための最善の方法を明確にしてもらえますか?

4

5 に答える 5

3

同じデリゲート 異なるメソッド。Exists Not Find を使用したい。Find は値を返しますが、exist は bool を返します。

if (lstAccounts.Exists(delegate(string sAccountNumber) { return sAccountNumber == drCurrentRow["AccountNumber"]; })
于 2010-03-24T15:55:26.083 に答える
1

リストのFindメソッドは文字列を返すため、Equalsメソッドまたは==を使用して比較する必要があります。その場合、if条件は問題ありません。

于 2010-03-24T16:01:06.713 に答える
1

問題はそのif (lstAccounts.Find部分です。

見つかった場合、これFindは文字列を返し、ifブール出力が期待されます。

Exists元の値を使用するか、結果と比較するようにステートメントを変更しますFind

于 2010-03-24T16:00:35.153 に答える
1

なぜこれがうまくいかないのですか?

foreach (DataRow drCurrentRow in dtMyDataTable.Rows) 
{
    if (lstAccounts.Contains(drCurrentRow["AccountNumber"].ToString()))
    {
        Found_DoSomething();
    }
    else
    {
        NotFound_DoSomethingElse();
    }
}
于 2010-03-24T15:55:08.860 に答える
0

linq を使ってみると、col 名などを受け取るヘルパーを作成できます...

システムを使用して; System.Collections を使用します。System.Collections.Generic の使用; System.Data の使用; System.Linq を使用します。System.Web の使用; System.Web.UI の使用; System.Web.UI.WebControls を使用します。

名前空間 WebApplication1 { public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { DataTable テーブル = new DataTable(); table.Columns.Add("col1", typeof(string));

        DataRow row;
        row = table.NewRow();
        row["col1"] = "123";
        table.Rows.Add(row);
        row = table.NewRow();
        row["col1"] = "456";
        table.Rows.Add(row);

        LinqList<DataRow> rows = new LinqList<DataRow>(table.Rows);
        // do a simple select
       DataRow [] selectedRows = (from r in rows where (string)r["col1"] == "123" select r).ToArray();

        if(selectedRows.Length > 0)
        {
            lable1.Text = "success";
        }
        else
        {
            lable1.Text = "failed";
        }
    }
}


// simple wrapper that implements IEnumerable<T>
internal class LinqList<T> : IEnumerable<T>, IEnumerable
{
    IEnumerable items;

    internal LinqList(IEnumerable items)
    {
        this.items = items;
    }

    #region IEnumerable<DataRow> Members
    IEnumerator<T> IEnumerable<T>.GetEnumerator()
    {
        foreach (T item in items)
            yield return item;
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        IEnumerable<T> ie = this;
        return ie.GetEnumerator();
    }
    #endregion
}

}

この URL から取得したコード DataTable を反復処理して、List オブジェクト内の要素を見つけますか?

于 2010-03-24T18:52:44.797 に答える