#c# #asp.net #list #generics
#c# #asp.net #Список #общие сведения
Вопрос:
Допустим, у меня есть следующий класс
public class abc
{
int id;
string name;
}
я использую этот класс как набор некоторых данных, и моя бизнес-логика добавляет в него несколько строк.
List<abc> lstData = GetData();
Теперь, если мне нужно изменить значение некоторого свойства, допустим, я хочу изменить свойство name с некоторым значением.
string replaceName = 'jay';
таким образом, этот jay должен быть в каждой строке списка в name property.
как это сделать? я думаю, что есть метод ConvertAll, который мы можем использовать….
Ответ №1:
ConvertAll
обычно используется для создания нового списка, тогда как звучит так, как будто вы просто хотите изменить свойства в существующих объектах. Поэтому я бы использовал:
foreach (abc value in lstData)
{
value.name = replaceName;
}
(Этот код выглядел бы более идиоматичным, если бы вы использовали имена, следующие за .Соглашения об именовании СЕТЕЙ, кстати.)
В качестве альтернативы, вы могли бы использовать, ConvertAll
если вы хотите создать новые объекты:
List<abc> newList = lstData.ConvertAll(old => new abc {
id = old.id,
name = replaceName
});
Это использует лямбда-выражение для делегата и инициализатор объекта для установки свойств в каждом новом объекте. Точный способ, которым вы бы подошли к этому, будет зависеть от вашего реального класса.
Комментарии:
1. чего я хочу, так это чтобы остальные свойства списка не изменялись, только определенное свойство списка должно быть изменено во всех строках. в этом случае имя должно быть изменено на любую вещь, но идентификаторы должны оставаться неизменными. может ли это быть достигнуто.
2. @ankur: Ну что, ты попробовал первый фрагмент кода? Это просто изменяет единственное свойство всех объектов в списке.
3. я попытался сделать что-то вроде этого int k = 1234; List<getData> lst = new List<getData>(); getData g = new getData(); for (int i = 0; i < 2; i ) { g.i = i; g.name = «ank» i.toString(); lst.Add(g); } строка b = «Rahul»; lst. ConvertAll(s => s.name = b); и это делает то, что нужно.
4. @ankur: Но это не то, что предложил мой ответ, не так ли? Вы пробовали какой-либо из подходов в моем ответе?
5. я попробовал оба из них. я хочу повторно использовать список после его изменения. я использовал ваш второй подход, но не создал новый список для того же самого. просто повторил список и изменил значения.
Ответ №2:
Используйте список.ForEach
lstData.ForEach(x => x.name = "jay");
Комментарии:
1. Лично я предпочитаю использовать,
foreach
если для этого нет веской причиныForEach
(например, у меня уже есть делегат). Смотрите blogs.msdn.com/b/ericlippert/archive/2009/05/18 /…2. @Jon У меня в основном опыт работы с C 🙂 Никогда не использовал std::for_each, потому что в C не было лямбд. Итак, вы можете себе представить!! Кстати, углубленное чтение вашей книги C # .. это потрясающе. Первая книга по программированию, которую я взял в руки, которая не научила меня, как выполнять цикл for / while … по крайней мере, пока
3. Рад, что вам это нравится — я очень сознательно хотел написать книгу, которая не начиналась с предположения, что никаких знаний 🙂
Ответ №3:
Вы можете использовать приведенный ниже оператор LINQ ForEach():
lstData.ForEach(data => data.Name = replaceName);
Ответ №4:
Вы имеете в виду, что хотите присвоить одинаковое значение свойству всех объектов в списке? Если да, то вы выполняете цикл по нему:
foreach (var item in lstData)
{
item.name = "jay";
}
Ответ №5:
Я думаю, что в реальной жизни, когда вы хотите изменить Name
, у вас должен быть идентификатор, поэтому на основе этого вы можете найти один объект для изменения в списке, например:
abc objAbc =(
from emp
in lstData
where emp => emp.Id = someId
select emp)
.SingleOrDefault();
Как только у вас есть objAbc
you can do objAbc.Name = "New Name"
I hope that's what you want to know. you need to do using System.Linq
для того, чтобы использовать linq-to-object.
Удачного кодирования