2017-07-13 2 views
0

Ich arbeite an einer App, die ich nicht entworfen habe, und hätte es nicht so entworfen. Ich habe eine Liste, die ich einem Dictionary<string, object> zuordnen möchte. Das resultierende Wörterbuch sollte wie folgt aussehen:Map-Liste zu benutzerdefinierte Wörterbuch

var dictionary = new Dictionary<string, object>{ 
{ CommonProperty.Name, item.Name }, 
{ CommonProperty.UriAddr, item.UriAddr}   
//other properties      
} 

CommonProperty eine versiegelte Klasse mit statischen Eigenschaften ist zB Name, UriAddr etc. Ich habe versucht, so etwas wie: -

ich stecken geblieben versuchen, die Linq Abfrage unten zu nutzen :

var dict = myList.Select((h, i) => new { key = h, index = i }) 
.ToDictionary(o => o.key, o => values[o.index])); 

Und ...

foreach(var item in list){ 
var _dict = new Dictionary<string, object>{ 
{CommonProperty.Name, item.Name}, 
//other properties 
    } 
} 

Die CommonProperty fügt der Eigenschaft zusätzliche Informationen hinzu und muss daher aufgerufen werden. Sowohl Schlüssel als auch Wert haben die gleichen "Namen".

Meine Frage ist: Wie kann ich myList zuordnen und ein Wörterbuch wie das obige zurückgeben? Gibt es einen besseren Weg?

Vielen Dank im Voraus.

+2

Sie haben sogar die Arten von 'myList gezeigt' und 'values' –

+2

Was ist der Nutzen des Wörterbuchs ist? Damit würdest du nur Asse 'dict [" Name "]' anstelle von 'item.Name' verwenden, also sehe ich den Vorteil nicht. Wenn Sie den Grund für das Wörterbuch angeben, könnte eine andere Möglichkeit zur Lösung des Problems besser sein. –

+0

Es sieht so aus, als ob Sie eine Liste erstellen möchten , >. Wenn Sie versuchen, aus jeder Elementeigenschaft einen Wörterbucheintrag zu erstellen. – Heiner

Antwort

1

Aus Ihren Beispielen sehe ich, dass Sie jedes Element der Liste Dictionary zuordnen möchten. Bitte versuchen Sie diesen Code:

var commonProps = typeof(CommonProperty).GetProperties(BindingFlags.Static | BindingFlags.Public); 
var itemProps = list.GetType().GenericTypeArguments[0].GetProperties().ToDictionary(k => k.Name, v => v); 

var result = list.Select(l => commonProps.ToDictionary(
    k => k.GetValue(null), 
    v => itemProps[v.Name].GetValue(l) 
)); 
1

Was genau meinen Sie mit "Beide Schlüssel und Wert sind von den gleichen 'Namen'"? Wenn Tasten Sie in einem Artikel in den dicrionary Spiel Eigenschaftsnamen wollen, dann können Sie Reflektion verwenden, wie folgt:

item.GetType().GetProperties().ToDictionary(x => x.Name, x => x.GetValue(item)); 

Dieses Beispiel filtert nicht durch CommonProperty die Ergebnisse in zusätzlichen Einträgen im Wörterbuch, wenn das Element alle Eigenschaften hat Sie sind nicht interessiert

das folgende Beispiel das komplette Programm, das in einem Verzeichniseigenschaften aller Dateien angezeigt ist.

static class Program 
{ 
    static Dictionary<string, object> ObjToDic(object o) 
    { 
     return o.GetType().GetProperties().ToDictionary(x => x.Name, x => x.GetValue(o)); 
    } 

    static void Main(string[] args) 
    { 
     var fileNames = Directory.EnumerateFiles("c:\\windows"); 

     foreach (string name in fileNames) 
     { 
      Console.WriteLine("=========================================="); 
      FileInfo fi = new FileInfo(name); 
      var propDict = ObjToDic(fi); // <== Here we convert FileInfo to dictionary 
      foreach (var item in propDict.AsEnumerable()) 
      { 
       Console.WriteLine(string.Format("{0}: {1}", item.Key, item.Value.ToString())); 
      } 
     } 
    } 
} 

beachten Sie, dass Eigenschaften und Felder in .NET sind. Beide werden mit der gleichen Syntax in C# gelesen und geschrieben, aber Reflektion behandelt sie unterschiedlich. Das obige Beispiel zeigt nur Eigenschaften an.

Verwandte Themen