C # Een lijst <model> omzetten in een woordenboek <enum, lijst <model >> op basis van enum-eigenschap in de modellen?

Niet te verwarren met: Hoe kan ik lijst naar hash-tabel omzetten in C #?

Ik heb een lijst met modellen die ik wil ordenen in een hashtabel met de enums als sleutel, en de lijst met modellen (die de waarde van het enum hebben) als de waarde.

public enum MyEnum
{
    Blue,
    Green
}

public class MyModel
{
    public MyModel(MyEnum myEnum, string foo, int bar)
    {
        this.MyEnum = myEnum;
        this.Foo = foo;
        this.Bar = bar;
    }

    public MyEnum MyEnum { get; set; }
    public string Foo { get; set; }
    public int Bar { get; set; }
}

List models = new List();

models.Add(new MyModel(MyEnum.Blue, "How", 1));
models.Add(new MyModel(MyEnum.Green, "Now", 2));
models.Add(new MyModel(MyEnum.Blue, "Brown", 3));
models.Add(new MyModel(MyEnum.Green, "Cow", 4));

Wat is de gemakkelijkste manier om de lijst om te zetten in een hash-tabel die er als volgt uitziet (vergeef de json):

{ 
   Blue:
   [
      { Blue, "How", 1 },
      { Blue, "Brown", 3 }
   ],
   Green:
   [
      { Green, "Now", 2 },
      { Green, "Cow", 4 }
   ]
}

Wanneer ik zoiets doe als dit:

var taskTable = tasks.Cast().ToDictionary(o => o.Task); (Where Task is the Enum)

Ik krijg deze uitzondering: "Een item met dezelfde sleutel is al toegevoegd."

One-liners met Lambda of Linq worden op prijs gesteld!

2

1 antwoord

Het lijkt erop dat je kunt doen met een Zoeken :

var lookup = models.ToLookup(o => o.Task);

Or if you really want the Dictionary>:

var dictionary = models.GroupBy(o => o.Task)
                       .ToDictionary(g => g.Key, g => g.ToList());
6
toegevoegd
@JonSkeet: je hebt gelijk! Linq was een van de beste uitvindingen die MS ooit heeft gedaan. Het maakt codering (in veel gevallen) leesbaarder. Maar zoals altijd in het leven: je kunt het goede niet ten goede slepen - soms kun je uitspraken doen die haaaaard zijn om te lezen! ;-)
toegevoegd de auteur Fischermaen, de bron
opzoeken is geweldig omdat ze ook de intentie aangeven en zijn geoptimaliseerd voor deze functionaliteit.
toegevoegd de auteur Scott Rippey, de bron
@Levitikon: En LINQ geeft zoveel van hen ... als ik een man-crush op een technologie zou kunnen hebben, zou LINQ het zijn ... gevolgd door LINQ naar XML.
toegevoegd de auteur Jon Skeet, de bron
Perfect! Ik ben dol op elegante oplossingen met 1 regel!
toegevoegd de auteur Levitikon, de bron