1

両方の参照を含むリストでユニオン、マージしたいので、これが私のコードです。このポルポスの準備ができているリストを定義するにはどうすればよいですか?

if (e.CommandName == "AddtoSelected")
{
    List<DetalleCita> lstAux = new List<DetalleCita>();
    foreach (GridViewRow row in this.dgvEstudios.Rows)
    {
        var GridData = GetValues(row);
        var GridData2 = GetValues(row);
        IList AftList2 = GridData2.Values.Where(r => r != null).ToList();
        AftList2.Cast<DetalleCita>();
        chkEstudio = dgvEstudios.Rows[index].FindControl("ChkAsignar") as CheckBox;
        if (chkEstudio.Checked)
        {

            IList AftList = GridData.Values.Where(r => r != null).ToList();
            lstAux.Add(
            new DetalleCita
            {
                codigoclase = Convert.ToInt32(AftList[0]),
                nombreestudio = AftList[1].ToString(),
                precioestudio = Convert.ToDouble(AftList[2]),
                horacita = dt,
                codigoestudio = AftList[4].ToString()
            });
        }
        index++;
        //this line to merge
        lstAux.ToList().AddRange(AftList2);
    }

    dgvEstudios.DataSource = lstAux;
    dgvEstudios.DataBind();
}

これは、rowcommand イベント内にあります。

4

1 に答える 1

4

から までのすべてのエントリを追加するAftList2場合は、 IEnumerable<> の要素をタイプとしてlstAux定義する必要があります( onのパラメーターとして使用するだけで十分です)。たとえば、次のようにします。AftList2DetalleCitaIEnumerable<DetalleCita>AddRange()List<DetalleCita>

var AftList2 = GridData2.Values.Where(r => r != null).Cast<DetalleCita>();

そして、そのすべての要素を に追加できますlstAux:

lstAux.AddRange(AftList2);

説明:

拡張メソッドの機能を誤解していると思いますToList()。から新しいリストを作成IEnumerable<T>し、その結果IEnumerable<T>は適用された元のリストとは関係ありません。

そのため、あなたは何の役にも立たないのですlist.ToList().AddRange(...)-あなたはリストを(によって新しく作成された別のToList())リストにコピーし、それを更新してから基本的にそれを捨てています(あなたはのようなことさえしていないのでlist2 = var1.ToList()、オリジナルvar1はその後変更されません! !!ToList()呼び出している場合は、おそらく結果を保存する必要があります)。

また、通常、あるリストを別のリストに変換する必要はありません。ToList()リスト ( List<T>) が必要IEnumerable<T>であるが (インデックス化できず、インデックスによる高速アクセスが必要な場合や遅延評価が必要な場合がありますが、すべての結果をこの時点で計算する必要がある場合に便利です)。時間 -- LINQ to objects クエリの結果を使用しようとすると、両方の状況が発生する可能IEnumerable<int> ints = from i in anotherInts where i > 20 select i;あります。とにかく:) 。anotherIntsList<int>ints List<int>IEnumerable<int>ToList()List<int> ints = (from i in anotherInts where i > 20 select i).ToList();

アップデート:

本当にユニオン セマンティクスを意味する場合 (たとえば、{ 1, 2 } と { 1, 3 } の場合、ユニオンは { 1, 2, 3 } のようになり、2 つのコレクションからの等しい要素の重複はありません) に切り替えることを検討してHashSet<T>ください (おそらくあなたはC#3.0を使用していて、最近の.NETフレームワークを持っていると思います)またはUnion()代わりに拡張メソッドを使用しますAddRange(これは最初のソリューションよりも優れているとは思いませんToList(). 新しいコレクションであり、または)a.Union(b)も更新しません。ab

于 2008-12-15T22:03:45.367 に答える