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

如果你想添加所有条目AftList2lstAux你应该定义AftList2为 IEnumerable<> 类型的元素DetalleCitaIEnumerable<DetalleCita>足以用作AddRange()on的参数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>(不可索引且您可能需要通过索引快速访问或延迟评估但您需要在此计算的所有结果时)很有用time -- 尝试使用 LINQ to objects 查询的结果时可能会出现这两种情况,例如:IEnumerable<int> ints = from i in anotherInts where i > 20 select i;-- 即使查询结果anotherInts不能转换为,因为它不是列表而是实现。在这种情况下,您可以使用获取列表无论如何:)。List<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 },两个集合中没有相同元素的重复)考虑切换到HashSet<T>(它很可能在您的情况下可用,因为您使用的是 C# 3.0 并且我想您有最近的 .NET 框架)或使用Union()扩展方法而不是AddRange(我认为这并不比第一个解决方案更好,并且要小心,因为它更像是ToList()- a.Union(b)返回新集合并且不更新ab)。

于 2008-12-15T22:03:45.367 回答