Общий список изменяет значение свойства в C#

#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.

Удачного кодирования