2016-06-21 2 views
0

Wenn ich eine Liste, wo TType = Parameter,LINQ Mit einer Klasse zu sortieren, die von LIST erbt <TTYPE>

public class Parameter 
    { 
     public string VendorId { get; set; } 

     public string RunMonth { get; set; } 

     public string CoverageMonth1 { get; set; } 
    } 

ich tun würde dies zum Beispiel sortieren wollte.

List<Models.Parameter> ps = new List<Models.Parameter>() 
{ 
     new Models.Parameter() { EffectiveDate = new DateTime(2016, 1, 1) } 
     ,new Models.Parameter() { EffectiveDate = new DateTime(2014, 1, 1) } 
}; 

ps = ps.OrderBy(p => p.EffectiveDate).ToList<Models.Parameter>(); 

Was passiert, wenn ich eine Klasse haben, Parametercollection, die

 public class ParameterCollection : List<Parameter> 
    { 
      //handy properties added 
    } 

von List<Parameter> erbt bekomme ich diesen Fehler:

ParameterCollection parameterCollection;  
parameterCollection = parameterCollection.OrderBy(parameter => parameter.EffectiveDate); 

Severity Code Description Project File Line Category Suppression State 
Error CS0266 Cannot implicitly convert type 'System.Linq.IOrderedEnumerable<StateAssessment.Models.Parameter>' to 'StateAssessment.Models.ParameterCollection'. An explicit conversion exists (are you missing a cast?) StateAssessment.Services C:\Workspace\Healthcare-Finance_IT\Main\WebApps\StateAssessment\StateAssessment.Services\Parameter.cs 32 Compiler Active 

Gibt es eine Möglichkeit das Casting zu Parametercollection zu handhaben in die LINQ-Anweisung?

+1

Vielleicht eine 'ToParameterCollection (diese IEnumerable ...' Erweiterungsmethode erstellen –

+0

Eric: Ja, die Besetzung ist fehlgeschlagen/ – ChadD

+0

Yacoub Massad: Können Sie ein Beispiel für ein solches Verfahren geben – ChadD

Antwort

0

Sie müssen eine neue ParameterCollection erstellen, um die Elemente in ihrer neuen Reihenfolge zu halten.

var ps2 = new ParameterCollection(); 
ps2.AddRange(ps.OrderBy(p => p.EffectiveDate)); 
ps = ps2; 

Natürlich könnte man das Leben leichter für sich selbst machen, indem Sie einen Konstruktor Überlastung zu schaffen, die List<> Überlastung geht in die eine IEnumerable<> nimmt mit zu beginnen.

ps = new ParameterCollection(ps.OrderBy(p => p.EffectiveDate)); 

Man könnte sogar eine Verlängerung Methode weg von IEnumerable<Parameter> erstellen.

ps = ps.OrderBy(p => p.EffectiveDate).ToParameterCollection(); 

Sie könnten auch ganz loszuwerden ParameterCollection betrachten, da Vererbung auf diese Weise verwendet, ist ein bisschen ein Antipattern.

+0

In meinem Code habe ich keine Objekte, die als LIST definiert sind, mit Ausnahme der ParametersCollection-Klasse, die von diesem Typ stammt. In Ihrem Beispiel würde das nicht funktionieren habe eine p2-Variable von LIST Typ zu sortieren.Ich bin auf der Suche nach einer sauberen, hoffentlich knappen Art und Weise zu sortieren, die verfügbar ist, ParametersCollection, ich bin schwach in LINQ und manchmal verloren in Generika, aber erwarten, dass die beste Lösung wohnt dort, also habe ich gesucht für Hilfe. Die Antwort muss diese Technologien nicht enthalten – ChadD

+0

@ChadD: Wenn Sie genau hinschauen, ist die Variable 'ps2' in meinem Beispiel nicht vom Typ' List ', also macht sie das, wonach Sie fragen. Ich habe Ihnen vier mögliche Ansätze zur Lösung dieses Problems gegeben. Ein anderer möglicher Ansatz wäre die Verwendung der 'Sort()' Methoden, die Sie von der 'List <>' Klasse erben. Aber ich würde Sie davor warnen, den Rat, den Sie hier bekommen, nicht zu ignorieren. Welchen Wert erhalten Sie von ParameterCollection? Wenn Sie Ihren gesamten Code so geändert haben, dass er 'List ' stattdessen verwendet, was würde dann fehlen? – StriplingWarrior

+0

Es tut mir leid, ich wollte sagen, dass in Ihrem Beispiel die Variable "ps" vom Typ LIST war und Sie sie zu einem neuen ParametersCollection-Objekt hinzugefügt haben. Ich würde nicht eine ps-Variable der Liste als meinen Ausgangspunkt haben. Re: "Wenn Sie geändert ..." .: Ich würde alle addierten Methoden, die nur für Sammlungen von LIST Auflistungen gelten, fehlen. Ich bin mir nicht sicher, warum dies ein anit patetrn – ChadD

Verwandte Themen