C# C语言中的并集二列表

C# C语言中的并集二列表,c#,gridview,rowcommand,C#,Gridview,Rowcommand,我想合并,合并到一个包含两个引用的列表中,所以这是我的代码,我如何定义一个列表来准备这个引用 if (e.CommandName == "AddtoSelected") { List<DetalleCita> lstAux = new List<DetalleCita>(); foreach (GridViewRow row in this.dgvEstudios.Rows) { var GridData = GetValues(r

我想合并,合并到一个包含两个引用的列表中,所以这是我的代码,我如何定义一个列表来准备这个引用

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中的所有条目添加到LSTAX,则应将AftList2定义为IEnumerable,且DETALLECTA类型的元素为IEnumerable就足以用作列表上AddRange的参数。例如:

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

我认为您误解了扩展方法ToList的功能。它从IEnumerable创建新列表,其结果与应用该列表的原始IEnumerable不关联

这就是为什么您在尝试执行列表。ToList.AddRange…-您正在将列表复制到另一个由ToList新建的列表中,更新它,然后基本上将其丢弃,因为您甚至没有执行类似list2=var1.ToList的操作,原始的var1在此之后保持不变!!!如果调用ToList,您很可能希望保存它的结果

另外,您通常不需要将一个列表转换为另一个列表,当您需要列表,但具有不可索引的IEnumerable,并且可能需要通过索引快速访问时,ToList非常有用,或lazy求值,但此时需要计算所有结果-在尝试使用LINQ的结果进行对象查询时,可能会出现这两种情况,例如:IEnumerable ints=来自i,在i>20的其他选项中选择i;-即使anotherInts是List,查询ints的结果也不能转换为List,因为它不是List,而是IEnumerable的实现。在这种情况下,您仍然可以使用ToList获取列表:在i>20的另一个列表中,list ints=from i选择i.ToList

更新:


如果你真的是指联合语义学,例如{1,2}和{1,3}联合的意思是{1,2,3},由于没有重复两个集合中的相等元素,所以考虑切换到HasSet,它最可能在您的情况下可用,因为您使用的是C 3,并且我认为Yoou.NeX.NET框架或使用Union Exchange方法而不是AddRange,我不认为这比第一个解决方案要好,并且要小心,因为它工作得更像。ToList-a.Unionb返回新集合,并且不更新a或b。

如果要将AftList2中的所有条目添加到LSTAX,则应将AftList2定义为IEnumerable,且DETALLECTA类型的元素为IEnumerable就足以用作列表上AddRange的参数。例如:

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

我认为您误解了扩展方法ToList的功能。它从IEnumerable创建新列表,其结果与应用该列表的原始IEnumerable不关联

这就是为什么您在尝试执行列表。ToList.AddRange…-您正在将列表复制到另一个由ToList新建的列表中,更新它,然后基本上将其丢弃,因为您甚至没有执行类似list2=var1.ToList的操作,原始的var1在此之后保持不变!!!如果调用ToList,您很可能希望保存它的结果

另外,您通常不需要将一个列表转换为另一个列表,当您需要列表,但具有不可索引的IEnumerable,并且可能需要通过索引快速访问时,ToList非常有用,或lazy求值,但此时需要计算所有结果-在尝试使用LINQ的结果进行对象查询时,可能会出现这两种情况,例如:IEnumerable ints=来自i,在i>20的其他选项中选择i;-即使anotherInts是List,查询ints的结果也不能转换为List,因为它不是List,而是IEnumerable的实现。在这种情况下,您仍然可以使用ToList获取列表:在i>20的另一个列表中,list ints=from i选择i.ToList

更新:

如果你真的是指联合语义学,例如{1,2}和{1,3}联合的意思是{1,2,3},由于没有重复两个集合中的相等元素,所以考虑切换到HasSet,它最可能在您的情况下可用,因为您使用的是C 3,并且我认为Yoou.NeX.NET框架或使用Union Exchange方法而不是AddRange,我不认为这比第一个解决方案要好,并且要小心,因为它工作得更像。ToList-a.Unionb返回新集合,不更新a或b