2016-03-29 3 views
1

ich eine Sammlung von Person List<Person> habe, jetzt muss ich ein Wörterbuch erstellen, die Key ein Name sein sollte und die Werte sind Distinct Werte dieser angesehenen Property dh List<Object>Modell Class Collection Konvertieren Wörterbuch basiert auf Eigenschaft als KEY mit LINQ C#

Das Wörterbuch sollte wie sein Dictionary<string, List<object>>

C# Source Code:

void Main() 
{ 
    List<Person> EmpList = new List<Person>() 
    { 
     new Person() {ID = 101, Name = "Peter", Gender = "Male", Role = "Manager"}, 
     new Person() {ID = 102, Name = "Emma Watson", Gender = "Female", Role = "Assistant"}, 
     new Person() {ID = 103, Name = "Kaliya", Gender = "Manager", Role = "Assistant"}, 
    }; 
} 

public class Person 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public string Gender { get; set; } 
    public string Role { get; set; } 
} 

Meine Erwartung ist

Dictionary<string, List<object>> EmpDictionary = new Dictionary<string, List<object>>(); 
EmpDictionary.Add("ID", new List<object>() { 101, 102, 103 }); 
EmpDictionary.Add("Name", new List<object>() { "Peter", "Emma Watson", "Kaliya" }); 
EmpDictionary.Add("Gender", new List<object>() { "Male", "Female" }); 
EmpDictionary.Add("Role", new List<object>() { "Manager", "Assistant" }); 

I

Hinweis ein Wörterbuch als wie diese mithilfe von LINQ C# konstruieren will: Geben Lösung als global. Es sollte

Antwort

0

können Sie verwenden:

var d = typeof(Person).GetProperties() 
         .Select(p => new 
         { 
          Key = p.Name, 
          Value = EmpList.Select(epm => p.GetValue(epm)).ToList() 
         }) 
         .ToDictionary(x => x.Key, x => x.Value); 
+0

Vielen Dank ... Wenn die Liste eine Artikelquelle ist, dann kennen wir den Typ der Sammlung nicht. Wie kann man das erreichen? bitte helfen Sie mir ... –

+0

Sie können diesen Beitrag hilfreich finden: [Wie finden Sie den Mitgliedstyp einer Liste?] (http://Stackoverflow.com/a/32822141/3110834) –

+0

Warum übergeben Sie den Namen und die Werte durch einen anonymen Typ? Warum geben Sie sie nicht direkt an "ToDictionary" weiter und vermeiden es, diese zu synthetisieren? –

0

Warum nicht einfach erstellen

var dictionary = new Dictionary<string, Person>(); 

dictionary.Add("101", new Person{ Id = 101, Name = "Peter" ... etc...} 

Sie dann dieses Wörterbuch-Adresse kann ein n Anzahl der Eigenschaften wesentlich leichter:

Console.WriteLine("Name: " + dictionary["101"].Name); 
+0

Ich kann dies mit EmpList.ToDictionary erreichen (x => x.ID); Aber meine Anforderung ist anders. Bitte lesen Sie den Beitrag noch einmal bitte ... –

+0

Sie sollten Ihren Code überdenken. Machen Sie Objekte, die für Sie und andere Kollegen Sinn ergeben. Anstatt zu versuchen, im Code "schlau" zu sein, sollten Sie vermeiden, die "nicht so schlauen" Dinge zu tun, wie die Lesbarkeit Ihres Codes zu reduzieren. Wenn Sie eine Gruppe von Personenobjekten haben, behandeln Sie sie so, und nicht als eine Menge seltsamer Eigenschaften, die Sie 15 Minuten damit verbringen werden zu verstehen, was Sie in 3 Monaten getan haben. –

+1

Ich erstelle ein benutzerdefiniertes DataGrid, für das ich die Spalten Distinct Werte für Filtervorgänge benötige. So, ich brauche so wie ... –

0

Dies wird nicht sei die performanteste Option (das hast du schon), aber es würde funktionieren.

var ret = typeof(Person) 
    .GetProperties() 
    .ToDictionary(c => c.Name, c => EmpList.Select(x => c.GetValue(x)).ToList()); 

würde ich ein bisschen versucht sein, zu überdenken, was Sie tun, zugegebenermaßen. Es sei denn, du versuchst speziell mit Reflexion und LINQ zusammen zu experimentieren (in diesem Fall, Rock on!), Ich bin mir nicht sicher, ob das für die meisten Fälle ein gutes Design sein wird. Nur zum Nachdenken.

Verwandte Themen