2017-12-28 51 views
-3

Ich habe eine Liste von Tupeln mit zwei Werten:Zurück

List<Tuple<string, string>> Descriptions; 

Und ich halte Inhalt dieser Zusatz, etwa so:

Descriptions.Add (new Tuple<string, string> ("max", "some description")); 
Descriptions.Add (new Tuple<string, string> ("joe", "some description")); 
Descriptions.Add (new Tuple<string, string> ("jane", "some description")); 
Descriptions.Add (new Tuple<string, string> ("max", "some other description")); 

I möchte eine Liste mit Linq abrufen, wobei Item1 im Tupel ein bestimmter Wert ist, wie zum Beispiel "max". Ich könnte diesen Code verwenden:

var s = Descriptions.Where (x => x.Item1 == "max"); 

aber s eine Liste von Tupeln zuweisen, die ich nicht will. Ich möchte nur eine Liste der Beschreibungszeichenfolgen, das heißt, es sollte eine list<string> mit allen Beschreibungen zurückgeben, die mit der Item1 Zeichenfolge "max" verbunden sind.

+1

[mit LINQ Erste in C# Gestartet] (https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/linq/getting-started-with-linq) –

Antwort

5

Verwendung Select:

var s = Descriptions.Where (x => x.Item1 == "max").Select(y => y.Item2); 

Das wird eine IEnumerable<string> zurück. Wenn Sie eine Liste wollen, müssen Sie auch ToList am Ende hinzufügen:

var s = Descriptions.Where (x => x.Item1 == "max").Select(y => y.Item2).ToList(); 

Oder können Sie Query-Syntax verwenden:

var s = from d in Descriptions 
     where d.Item1 == "max" 
     select d.Item2; 

Das ist das gleiche wie die erste Option. Tatsächlich übersetzt der Compiler die Abfragesyntax in linqs Erweiterungsmethoden.

3

Nach Where() können Sie Select() Methode verwenden, um nur description zu bekommen Item2 von Tuple die in Ihrem Fall sein und Sie würden tun müssen, wie:

var s = Descriptions.Where(x => x.Item1 == "max") 
        .Select(x=>x.Item2); // projects only Description 

Diese finden Sie alle Elemente in Form von IEnumerable<string> zurück, die haben Item1 mit Wert "max" und wenn Sie es wirklich als List<string> bekommen möchten, dann können Sie ToList() Methodenaufruf am Ende hinzufügen.

Ich hoffe, es hilft.

+0

Danke, das hat funktioniert. Die andere Antwort passt jedoch eher zu meiner Situation. – Najeeb

+0

ja, froh zu helfen und es ist dein Ruf :) beide würden funktionieren. –

0

Wenn Sie die anderen Lösungen nicht verwenden, verwenden Sie anstelle einer Tupelliste ein Wörterbuch. Beim Aussehen Ihres Contents ist dies mehr, was Sie vielleicht möchten (nur wenn Ihre Namen eindeutig sind).

Dictionary<string, string> NameDesc = new Dictionary<string, string>(); 
      NameDesc.Add("max", "desc1"); 
      NameDesc.Add("tim", "desc2"); 

      var description = NameDesc["max"]; 
      var maxExists = NameDesc.ContainsKey("max"); 
+0

Die Frage gibt in den Beispieldaten den Wert "max" zweimal an. Ein Wörterbuch wird das nicht zulassen ... –

Verwandte Themen