Союз два Список - PullRequest
       8

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

1 голос
/ 16 декабря 2008

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

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

4 голосов
/ 16 декабря 2008

Если вы хотите добавить все записи от 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();).

UPDATE:

Если вы действительно имеете в виду семантику объединения (например, для {1, 2} и {1, 3} union будет что-то вроде {1, 2, 3}, без дублирования равных элементов из двух коллекции) рассмотрите возможность перехода на HashSet<T> (это, скорее всего, доступно в вашей ситуации, потому что вы используете C # 3.0, и я полагаю, у вас есть последняя .NET Framework) или использовать метод расширения Union() вместо AddRange (я не думаю, что это лучше, чем первое решение, и будьте осторожны, потому что оно работает больше как ToList() - a.Union(b), возвращает новую коллекцию и НЕ обновляет a или b).

...