2013-08-21 3 views
5

Ich habe derzeit ein List<T> der folgenden Klasse aus:Hier finden Sie eine Liste <string> von Variablen innerhalb einer Liste <T>

int id { get; set; } 
string title { get; set; } 
string description { get; set; } 

ich List<string> von nur alle der Titel in der Liste erstellen möchten

Welches wäre der beste Weg, dies zu erreichen?

bearbeiten Meine Beschreibung Feld mittelt 2k Zeichen ... ich nicht wollen, dass verlangsamen nur bekommen Titel.

Edit2 Ich verwende zuerst MVC-Code (Entity Framework). Die List<T> ist im _context gespeichert, die ich abfragen, um die Daten zu erhalten.

Edit3 Wenn möglich .. Gibt es eine Möglichkeit, den Titel UND ID zu bekommen?

+1

Warum glauben Sie, dass die Eigenschaft 'description' Titel verlangsamen könnte? Ist die Liste bereits initialisiert? Laden Sie es immer in einer Methode? Vielleicht können Sie stattdessen ein Feld verwenden, wenn Sie es oft brauchen. Randnotiz: Sie sollten den [.NET-Namenskonventionen] folgen (http://msdn.microsoft.com/en-us/library/ms229043.aspx). Also sollten Eigenschaften [Pascal Case] ​​sein (http://msdn.microsoft.com/en-us/library/x2dbyw72 (v = vs.71) .aspx). –

+0

Ich habe meine Frage aktualisiert. Wenn ich den _context in einer foreach-Schleife anrufe, dann füge die Ergebnisse zu einer neuen Liste hinzu, um zurückzukehren, es dauert ungefähr 2 Sekunden für 2 Ergebnisse. – TheGeekZn

Antwort

14

Ich möchte ein List<string> nur der Titel alle in der Liste kann

Sie Projektion über Select verwenden erstellen.

var list = new List<SomeClass>(); 

var titleList = list.Select(x => x.title).ToList(); 

Siehe Getting Started with LINQ in C# Weitere Informationen zu LINQ-Erweiterungsmethoden.

Wenn möglich .. Gibt es eine Möglichkeit, den Titel UND ID zu bekommen?

Sie können ein Anonymous Type verwenden alle drei Eigenschaften in einer Liste zu setzen:

var entityList = list.Select(x => new { x.title, x.id, x.description }).ToList(); 

die die beste Leistung Weg wäre, dies zu tun?

var list = new List<SomeClass>(); 
var titleList = new List<string>(list.Count); 

foreach(var item in list) 
{ 
    titleList.Add(item.title); 
} 

LINQ wird keine einfache foreach Aussage, übertreffen, aber das ist ein Kompromiss Sie durch Benchmarking bewerten sollte, da der Unterschied in den meisten Fällen vernachlässigbar ist.

Microbenchmark

+0

Ich bin mir nicht sicher, warum Sie "Abfragesyntax und Methodensyntax in LINQ" verknüpfen. –

+2

Es erklärt die verschiedenen Erweiterungsmethoden von linq, wenn das OP nicht mit ihnen vertraut ist. Wenn Sie einen besseren Link kennen, kann ich ihn tauschen. – Romoku

+0

Die Verwendung einer foreach-Schleife dauerte ~ 4 Sekunden, um die Ergebnisse zu erhalten. Die Verwendung von .Select() brachte das auf ungefähr ~ 0,7 Sekunden herunter. – TheGeekZn

4
list.Select(o => o.title).ToList(); 

wo list die List<T> Ihrer generischer Typ ist.

8

Klingt wie Sie Entity Framework verwenden, wobei in diesem Fall würden Sie die List<string> von einem List<T> nicht schaffen - Sie List<string> direkt von Ihrem _context abfragen würde:

var titles = _context.MyTable.Select(x => x.title).ToList(); 

und ja, können Sie erhält den Titel und die ID zusammen:

var titleAndIds = _context.MyTable.Select(x => new{ x.title, x.id}).ToList(); 

dies gibt Ihnen ein List<T> wo T einen anonymen Typ ist, die Eigenschaften title undenthält.

+1

+1 für die Berücksichtigung von Entity-Framework – Habib

+0

+1 in der Tat. Ich benutze EF, obwohl die anderen Varianten von Antworten tatsächlich dieses Rätsel lösen. Obwohl ich meine Frage aktualisiert habe, um in ein anderes Zahnrad zu werfen. – TheGeekZn

+0

, aber nur dieser aktiviert Edit2, Beschreibungen werden nicht berücksichtigt. –