2016-06-29 4 views
0

Как переписать этот пример кода сортировки, чтобы он использовал универсальное расширение вместо второй строки?Как написать родовое расширение сортировки

Я хотел бы что-то вроде Тхи

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

Мой рабочий код

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

Насколько я получил с общим расширением

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

я могу возможно решить с этим LINQ вместо 'вар foosSorted = Unit.GetFoos() OrderBy (ф => f.Name) .ToList(); ', но мне все же хотелось бы знать, как сделать это с помощью решения generic extion, потому что я так плохо отношусь к общей части. – radbyx

+0

@ Шива, да, я тоже сразу понял этот вопрос. Но я все равно хотел бы узнать общую альтернативу. – radbyx

+1

Вы должны пойти с этим ответом http://stackoverflow.com/a/26406452/1789202 – CSharpie

ответ

1

Намерены ли вы создавать элементы списка? . Как это:

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

Должны ли Foo1 и Foo2 распространяться от IFoo? Потому что, если это не похоже на то, что я понимаю. – radbyx

+1

Я видел ваш комментарий * Потому что иногда мой класс i Unit, а иногда и группа *. Поэтому оба из них должны реализовать интерфейс «IFoo», например. – niksofteng

1

Ваш параметр должен быть набор вашего типа, так что вы будете иметь возможность рассматривать его как совокупность, и получить доступ к Name собственности:

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; 
    } 
} 

Вы бы не использовать родовое здесь, потому что конкретно нужно использовать Name, что является собственностью вашего класса Foo. Если он был определен в интерфейсе, вы можете сделать свой общий набор расширением для интерфейса.

Обратите внимание, что это редактирует существующий список, а не возвращает новый список, например LINQ.

+0

Можете вы заменить 'Foo' на' T'? Потому что иногда мой класс i Unit и иногда это группа, чтобы быть точным. – radbyx

+0

Вы также можете передать выражение, которое указывает на свойство, которое вы хотели сравнить, например, 'MySort (x => x.Propname)', таким образом вы могли бы сравнить любой тип для сортировки – Charleh

+1

@radbyx Сделайте свои 'Unit' и' Group 'classes совместно используют интерфейс, который предоставляет' Name'? Если нет, вы не можете сделать это общее, вместо этого вам придется использовать 'dynamic'. – juharr