簡體   English   中英

在 C# 中聯合兩個列表

[英]Union two List in C#

我想聯合,合並一個包含兩個引用的列表,所以這是我的代碼,我如何定義一個為這個海豚做好准備的列表?

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 事件中。

如果要將AftList2所有條目添加到lstAux您應該將AftList2定義為 IEnumerable<> 元素類型為DetalleCitaIEnumerable<DetalleCita>足以用作List<DetalleCita>AddRange()參數)。 例如像這樣:

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()結果)。

此外,您通常不需要將一個列表轉換為另一個列表,當您需要列表( List<T> )但具有IEnumerable<T> (不可索引,您可能需要通過索引快速訪問時, ToList()很有用,或惰性求值,但此時您需要計算所有結果——嘗試使用 LINQ to objects 查詢的結果時可能會出現這兩種情況,例如: IEnumerable<int> ints = from i in anotherInts where i > 20 select i; --即使anotherIntsList<int>查詢ints結果也不能intsList<int>因為它不是列表而是IEnumerable<int> 。在這種情況下,您仍然可以使用ToList()獲取列表: List<int> ints = (from i in anotherInts where i > 20 select i).ToList(); )。

更新:

如果您的意思是聯合語義(例如,對於 { 1, 2 } 和 { 1, 3 }聯合將類似於 { 1, 2, 3 },沒有來自兩個集合的相等元素的重復)考慮切換到HashSet<T> (它很可能在您的情況下可用,因為您使用的是 C# 3.0,我想您有最近的 .NET 框架)或使用Union()擴展方法而不是AddRange (我認為這並不比第一個解決方案更好,請小心因為它更像ToList() -- a.Union(b)返回新集合並且不更新ab )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM