联盟二名单

时间:2008-12-15 21:30:08

标签: c# gridview rowcommand

我想联合,合并一个包含两个引用的List,所以这是我的代码,我该如何为这个porpouses定义一个列表呢?

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

1 个答案:

答案 0 :(得分:4)

如果您要将AftList2中的所有条目添加到lstAux,则应将AftList2定义为IEnumerable&lt;&gt;使用DetalleCita类型的元素(IEnumerable<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结果查询对象时可能会出现两种情况:例如:IEnumerable<int> ints = from i in anotherInts where i > 20 select i; - 即使{{1} } anotherInts查询结果List<int> 无法投放ints,因为它不是列表,而是List<int>的实现。在这种情况下,你无论如何都可以使用IEnumerable<int>来获取列表:ToList())。

更新:

如果你真的是指工会语义(例如{1,2}和{1,3} union 就像{1,2,3}那样,没有重复相同的元素来自两个集合)考虑切换到List<int> ints = (from i in anotherInts where i > 20 select i).ToList();(最有可能在你的情况下可用,因为你正在使用C#3.0,我想你最近有.NET框架)或使用HashSet<T>扩展方法而不是{{1 (我不认为这比第一个解决方案更好并且要小心,因为它更像Union() - AddRange返回新集合并且不会更新ToList()或{{ 1}})。