2015-11-04 2 views
1

У меня есть следующая проблема: у меня есть список строк. У меня также есть класс со строковым свойством Name и конструктор для класса, который принимает строку в качестве своего одного аргумента. Таким образом, я могу создать список объектов, итерации по списку строк.Динамическое изменение значений списка в C#

Теперь я хотел бы изменить свойство Name одного из этих объектов и в результате обновить исходный список строк автоматом. Это возможно? Я не могу предположить, что список строк имеет уникальные значения. Вот некоторые основные код, который не решить мою проблему, но, надеюсь, иллюстрирует то, что мне нужно сделать:

using System; 
using System.Collections.Generic; 
using System.Linq; 

public class Program 
{ 
    public static void Main() 
    { 
     List<string> nameList = new List<string>(new string[] {"Andy", "Betty"}); 
     List<Person> personList = new List<Person>(); 
     foreach (string name in nameList) 
     { 
      Person newPerson = new Person(name); 
      personList.Add(newPerson); 
     } 

     foreach (Person person in personList) 
     { 
      Console.WriteLine(person.Name); 
     } 

     /* Note: these next two line are just being used to illustrate 
     changing a Person's Name property. */ 
     Person aPerson = personList.First(p => p.Name == "Andy"); 
     aPerson.Name = "Charlie"; 

     foreach (string name in nameList) 
     { 
      Console.WriteLine(name); 
     } 

     /* The output of this is: 
     Andy 
     Betty 
     Andy 
     Betty 

     but I would like to get: 
     Charlie 
     Betty 
     Andy 
     Betty 
    } 

    public class Person 
    { 
     public string Name; 

     public Person(string name) 
     { 
      Name = name; 
     } 
    } 
} 

Можно ли предложить наилучший подход к этой проблеме?

+3

Есть ли причина, по которой вам нужно обновить исходный список, если вы можете просто перебрать «Список », чтобы получить последние имена? – Steve

+1

Вы имеете в виду выход должен быть Чарли Бетти Энди Бетти –

+0

Это странно, хотя код должен работать. –

ответ

1

Если вы готовы изменить nameList быть типа List<Func<string>>, то вы можете сделать это:

List<Person> personList = 
    new string[] { "Andy", "Betty" } 
     .Select(n => new Person(n)) 
     .ToList(); 

foreach (Person person in personList) 
{ 
    Console.WriteLine(person.Name); 
} 

Person aPerson = personList.First(p => p.Name == "Andy"); 
aPerson.Name = "Charlie"; 

List<Func<string>> nameList = 
    personList 
     .Select(p => (Func<string>)(() => p.Name)) 
     .ToList(); 

foreach (Func<string> f in nameList) 
{ 
    Console.WriteLine(f()); 
} 

Это выводит:

Andy 
Betty 
Charlie 
Betty 
1

Вы обновляете человек экземпляр из personList и печатей nameList в конце. Думаю, вам нужно поменять порядок foreach блоков.

Смежные вопросы