9

DBから取得したデータを格納するために使用するカスタムクラス(NTDropDownおよび)をいくつか作成しました。のリストと2つNTBaseFreightのリストを初期化します。NTBaseFreightNTDropDown

貨物リストに貨物を追加するために正常に使用できますList.Addが、コードをデバッグすると、2つのドロップダウンリストには1つしか含まれずNTDropDown、常に同じ値になりますNTDropDown(これは参照の問題であると想定していますが、何をしていますか?間違い)?

例を挙げると、2行目で、carrierとcarrier_labelwere"001", "MyTruckingCompany"およびifステートメントのifステートメントにブレークを入れるとfrt_carriers、frt_carriersとfrt_modesの両方のリストに1つの項目のみが含まれ、値は"001", "MyTruckingCompany"...と同じ値になりNTDropDownます。

コード:

List<NTDropDown> frt_carriers = new List<NTDropDown>();
List<NTDropDown> frt_modes = new List<NTDropDown>();
List<NTBaseFreight> freights = new List<NTBaseFreight>();
NTDropDown tempDropDown = new NTDropDown();
NTBaseFreight tempFreight = new NTBaseFreight();

//....Code to grab data from the DB...removed

while (myReader.Read())
{
    tempFreight = readBaseFreight((IDataRecord)myReader);

    //check if the carrier and mode are in the dropdown list (add them if not)
    tempDropDown.value = tempFreight.carrier;
    tempDropDown.label = tempFreight.carrier_label;
    if (!frt_carriers.Contains(tempDropDown)) frt_carriers.Add(tempDropDown);

    tempDropDown.value = tempFreight.mode;
    tempDropDown.label = tempFreight.mode_label;
    if (!frt_modes.Contains(tempDropDown)) frt_modes.Add(tempDropDown);

    //Add the freight to the list
    freights.Add(tempFreight);
}
4

2 に答える 2

15

はい、参照型のリストは実際には単なる参照のリストです。

リストに保存するオブジェクトごとに新しいインスタンスを作成する必要があります。

また、このContainsメソッドは参照を比較するため、同じデータを含む2つのオブジェクトは等しいとは見なされません。リスト内のオブジェクトのプロパティで値を探します。

if (!frt_carriers.Any(c => c.label == tempFreight.carrier_label)) {
  NTDropDown tempDropDown = new NTDropDown {
    value = tempFreight.carrier,
    label = tempFreight.carrier_label
  };
  frt_carriers.Add(tempDropDown);
}
于 2012-11-07T18:28:51.357 に答える
4

tempDropDownループ全体で同じオブジェクトです。複数のインスタンスを追加する場合は、その新しいインスタンスを作成する必要があります。

そのtempDropDownをリストに追加して、あなたが何をしようとしているのかを正確に把握するのに苦労しています。

于 2012-11-07T18:28:04.590 に答える