Союз два Список
Я хочу объединиться, объединить в Список, который содержит обе ссылки, так что это мой код, как я могу определить список готов для этой части?
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
).