2010-09-01 2 views
9

Прошу прощения за путаное название, но я не нашел лучшего способа объяснить свою проблему.C# получение списка из поля из списка

У меня есть список объектов myList, которые можно назвать «MyObject». объекты выглядят примерно так:

Class MyObject 
{ 
    int MYInt{get;set;} 
    string MYString{get;set;} 
} 

List<MyObject> myList; 
... 

Я ищу хороший/короткий/фантазии способ создания List<string> от «MyList», где я использую только свойство «MyString».

я могу это сделать с помощью myList.forEach(), но мне было интересно, если есть способ лучше

Спасибо !!

ответ

13

С LINQ:

var list = myList.Select(o => o.MYString); 

Это возвращает IEnumerable<string>. Чтобы получить List<string> просто добавить вызов ToList():

var list = myList.Select(o => o.MYString).ToList(); 

Затем перебирать результаты, как обычно:

foreach (string s in list) 
{ 
    Console.WriteLine(s); 
} 
+1

Может быть, стоит отметить, что, если все, что вам нужно сделать, это итерация над ним, вам не нужно 'ToList()'. Используйте это только в том случае, если вам нужно изменить новый список или индекс. – Timwi

1

Вот Ahmad's answer используя интегрированный синтаксис запроса:

var strings = from x in myList 
       select x.MYString; 

List<string> list = strings.ToList(); 

Этот также можно было бы написать:

List<string> list = (from x in myList 
        select x.MYString).ToList(); 
1

Нет необходимости в LINQ, если ваши списки ввода и вывода равны List<T>. Вы можете использовать метод ConvertAll вместо:

List<string> listOfStrings = myList.ConvertAll(o => o.MYString); 
+0

хорошо, в моем случае вход и выход не совпадают. input - это список , а вывод - список . будет convertAll() все еще работать? – edan

+0

Что означает «нет необходимости в LINQ»? Это не похоже на то, что LINQ - это целая отдельная библиотека или что-то еще. Используете ли вы .ConvertAll' или '.Select', не имеет практических различий. – Timwi

+0

@edan: Да, 'ConvertAll' будет работать, как в моем примере выше. – LukeH