2016-06-29 30 views
0

Wie schreibe ich diese Sortierung Beispielcode, so dass es eine generische Erweiterung anstelle der zweiten Zeile verwendet?Wie schreibe ich eine generische Sortierung Extension

würde ich so etwas wie thi

var foosSorted = Unit.Foos().MyGenericSortFunction(); 

Mein Arbeits Code

var foosSorted = Unit.Foos(); // Not sorted yet 
foosSorted.Sort((x, y) => string.Compare(x.Name, y.Name)); 

mögen Wie weit ich mit dem generischen Erweiterung bekam

public static class ObjectExtension 
{ 
    public static T Sort<T>(this T list) where T : ??? 
    { 
     return list.Sort((x, y) => string.Compare(x.Name, y.Name)); 
    } 
} 
+0

Ich kann vielleicht lösen es mit diesem Linq statt 'var foosSorted = Unit.GetFoos() SortiertNach (f => f.Name) .ToList(); 'aber ich würde immer noch gerne wissen, wie man das mit einer generischen extion-lösung macht, weil ich mit dem generischen teil so schlecht bin. – radbyx

+0

@Shiva ja ich sah diese Frage gleich danach. Aber ich möchte immer noch die generische Alternative lernen. – radbyx

+1

Sie sollten mit dieser Antwort gehen http://StackOverflow.com/a/26406452/1789202 – CSharpie

Antwort

1

Haben Sie vor, Listenelemente generisch zu machen? . Wie folgt aus:

public static class ObjectExtension 
{ 
    public static List<T> Sort<T>(this List<T> list) where T : IFoo 
    { 
     list.Sort((x, y) => string.Compare(x.Name, y.Name)); 
     return list; 
    } 
} 

public interface IFoo { 
    string Name { get; } 
} 

public class Foo1 { 
    public string Name { get; set; } 
} 

public class Foo2 { 
    public string Name { get; set; } 
} 
+0

Sollten sich Foo1 und Foo2 von IFoo erstrecken? Denn wenn es nicht so aussieht, verstehe ich etwas. – radbyx

+1

Ich habe Ihren Kommentar gesehen * Weil manchmal meine Klasse ich Einheit und manchmal ist es Gruppe *. Also sollten beide eine Schnittstelle implementieren, zB "IFoo". – niksofteng

1

Ihre Parameter sollte die Sammlung Ihrer Art sein, so dass Sie es behandeln, als eine Sammlung können, und greifen Sie auf die Name Eigenschaft:

public static class ObjectExtension 
{ 
    public static List<Foo> MyGenericSortFunction(this List<Foo> list) 
    { 
     list.Sort((x, y) => string.Compare(x.Name, y.Name)); 
     return list; 
    } 
} 

Sie würden eine hier nicht verwenden generic weil Sie speziell benötigen zu verwenden Name, die eine Eigenschaft Ihrer Foo Klasse ist. Wenn es in einer Schnittstelle definiert wurde, könnten Sie Ihre Erweiterung für die Schnittstelle generisch machen.

Beachten Sie, dass dies die vorhandene Liste bearbeitet, anstatt eine neue Liste wie LINQ zurückgeben würde.

+0

Können Sie "Foo" durch "T" ersetzen? Weil manchmal meine Klasse I Einheit und manchmal ist es Gruppe um genau zu sein. – radbyx

+0

Sie können auch einen Ausdruck übergeben, der auf die zu vergleichende Eigenschaft verweist, wie 'MySort (x => x.Propname)', so können Sie jeden Typ zum Sortieren vergleichen – Charleh

+1

@radbyx Tun Sie Ihre 'Einheit' und' Gruppe 'Klassen teilen eine Schnittstelle, die' Name' freilegt? Wenn nicht, können Sie das nicht generisch machen, stattdessen müssten Sie 'dynamic' verwenden. – juharr