Союз два Список

Я хочу объединиться, объединить в Список, который содержит обе ссылки, так что это мой код, как я могу определить список готов для этой части?

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 ответ

Решение

Если вы хотите добавить все записи из AftList2 в lstAux вы должны определить AftList2 как IEnumerable<> с элементами типа 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; -- даже если 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 Framework) или используете Union() метод расширения вместо AddRange (Я не думаю, что это лучше, чем первое решение, и будьте осторожны, потому что это работает как ToList() - a.Union(b) вернуть новую коллекцию и не обновляет либо a или же b).

Другие вопросы по тегам