2017-05-10 1 views
0

Ich habe einen List<Dictionary<string, object>> mit Werten wie folgt aus:Wie konvertiert man eine Liste <Dictionary <string, object >> in eine Liste <string> der Eigenschaft "name" jedes Elements in einem Lambda?

{ name: "Joe", age: 23, ... }, 
{ name: "Jack", age: 19, ... }, 
... 

ich eine List<string> aus, dass erstellen möchten, die die Namen hält.

Wie würde ich das (zusammen mit der Besetzung) tun?

Ich weiß, wie Sie die Werte nach Name auswählen, aber wie verwende ich ein Lambda, um das Feld name zurückzugeben und es in String für die Liste zu werfen?

Ist das richtig?

List<string> names = objects.Select(
    item => item[ "name" ].ToString() 
).ToList<string>(); 
+2

Warum versuchen Sie es nicht. –

+0

Scheint, es ist OK. 'ToString()' Methode in dieser Zeile: 'tem [" name "] .ToString()' ist redundant. –

+0

@MaciejLos ist notwendig, weil das OP-Dictionary Objekte als Werte hat, keine Strings, also müssen Sie es konvertieren oder umwandeln. – stybl

Antwort

5

sehen, ob das funktioniert:

var names = objects.Select(item => (string)item["name"]).ToList(); 

Allerdings, wenn ich einen Vorschlag machen können, sollten Sie nicht Wörterbücher auf diese Weise verwenden. Erwägen Sie, eine Klasse für die Daten zu erstellen, die Sie in Ihrem Wörterbuch haben.

+0

Ich benutze keine Wörterbücher auf diese Weise, es ist das, was mir von einer anderen Bibliothek nach einer Anfrage für Daten aus der Datenbank zurückgegeben wird. Es repräsentiert die Datenzeilen. –

1

Da die Werte in einem Wörterbuch gespeichert sind, ist der Schlüssel möglicherweise nicht vorhanden. Zum Schutz vor KeyNotFoundExceptionDictionary(TKey, TValue).TryGetValue(TKey, TValue) verwenden.

var objects = new List<Dictionary<string, object>> 
{ 
    new Dictionary<string, object> 
    { 
     {"name", "Foo"} 
    }, 
    new Dictionary<string, object> 
    { 
     {"name", "Bar"} 
    }, 
    new Dictionary<string, object> 
    { 
     {"blah", "Baz"} 
    } 
}; 

// C# Local function 
IEnumerable<string> GetName(IDictionary<string, object> obj) 
{ 
    // C# 7 out variable 
    if (obj.TryGetValue("name", out var name)) 
    { 
     yield return name as string; 
    } 
} 

// ["Foo", "Bar"] 
var names = 
    objects 
     .SelectMany(GetName) 
     .ToList(); 
Verwandte Themen