2012-04-04 5 views
3

Ich habe eine Liste von anonymen Objekten, die folgende Felder in C# enthalten, die von einer LINQ-Abfrage abgeleitet wurden.Wie konvertieren Array-Objekte in ein anderes mit LINQ?

{ 
String category 
decimal Jan 
decimal Feb 
decimal Mar 
decimal Apr 
decimal May 
decimal Jun 
decimal Jul 
decimal Aug 
decimal Sep 
decimal Oct 
decimal Nov 
decimal Dec 
} 

wie könnte ich eine Liste von Objekten, die ein Feld für jeden Wert der Kategorie (so im wesentlichen 12 Objekten ein Objekt für jeden Monat (Januar, Februar, März usw. erstellen).

ExpectedResult { 
string Month, 
decimal category1, 
decimal category2, 
decimal category3, 
... 
decimal categoryN 
} 

. so 12 Objekte von ExpectedResult hätte führen nicht, wie viele Kategorien zu wissen,/ist ein Problem Jeder schneller Vorschlag wäre hilfreich

+0

Also würde das neue Objekt aussehen wie 'var Jan = {Kat1Name = 1.3, Kat2Name = 15.5, Kat3Name = 90.6, ...}'? Was ist zu tun, wenn der Kategoriename kein gültiger C# -Kennzeichner ist? – mellamokb

+0

Ich möchte eine var newItem = new {Monat = Jan, Cat1Name = 1.3, cat2Name = 13.5 ...} –

+1

Was ist die ursprüngliche Abfrage? – Phil

Antwort

2

Sie können versuchen, einen Select() -Methode:..

anonymousList.SelectMany(x=>new[]{ 
            new {Cat=category, Month="Jan", Val=Jan}, 
            new {Cat=category, Month="Feb", Val=Feb}, 
            ... , 
            new {Cat=category, Month="Dec", Val=Dec} 
           }); 

Für jedes Ihrer anonymen Quellobjekte erzeugt diese Abfrage ein Array von 12 neuen anonymen Objekten, und diese Arrays (als Enumerables) werden dann zu einer großen Sammlung verkettet.

Nur um zu vermeiden Strings später zu vergleichen, sollten Sie für die Monate des Jahres eine Enum mit (leider .NET verfügt nicht über eine integrierte):

public enum Month 
{ 
    January = 1, 
    February = 2, 
    ... 
    December = 12 
} 

... 

anonymousList.SelectMany(x=>new[]{ 
            new {Cat=category, Month=Month.January, Val=Jan}, 
            new {Cat=category, Month=Month.February, Val=Feb}, 
            ... , 
            new {Cat=category, Month=Month.December, Val=Dec} 
           }); 
+0

Dies ist nicht, was das OP braucht. Er möchte mehrere anonyme Klassen der folgenden Definition haben: {öffentliche Zeichenkette Monat, öffentliche Dezimalstelle Kategorie1, öffentliche Dezimalkategorie2, öffentliche Dezimalkategorie3}, wobei Kategorie1..n Werte aus der vorherigen Abfrage sind. Was ist nicht möglich (außer emittierende IL-Code :) –

+0

@KeithS, versuchte Ihre Lösung. Es erstellt mehrere Einträge. Was wir erwarten, ist ein konsolidiertes Ergebnis von 12 Datensätzen - eines für jeden Monat. Leider kann ich sie nicht gruppieren, nachdem Sie eine neue Kategorie erstellt haben. –

0

von Keiths Ab beantworten Sie könnten Gruppe dies Monate:

var results = from x in KeithsAnswer 
       group x by x.Month into g 
       select new { Month = g.Key, CategoryValues = g.Select(c => new { c.Month, c.Val }).ToArray()}; 

Sie können diese direkt an den Client übergeben, dort zu verarbeiten, oder wenn Sie wirklich das Formular benötigen Sie oben angegeben hat, können Sie Ihre eigenen JavaScriptConverter oder verwenden Sie einen dynamischen/ExpandoObject implementieren, um die Werte zu speichern, wie Eigenschaften.

Verwandte Themen