2015-06-19 7 views
-2

Если у меня есть List<T>, я могу сортировать его на месте, используя, напримерОтсортировать IList <T> вместо

myList.Sort((x,y) => x.MyComparisonMethod(y)); 

Если у меня есть IList<T>, я могу сортировать его в новый список с помощью

var sortedIList = unsortedIList.OrderBy(x => x.SortingValue); 

Как я могу сортировать IList<T> на месте?

Я использую C# .NET 4.5.1.

+1

Почему вы хотите это сделать? Какая ситуация у вас в этом 'unsortedIList = unsortedIList.OrderBy (x => x.SortingValue);' не решит? –

+0

_ «Я могу сортировать его в новом списке, используя« _ no », это не тот случай,' OrderBy' не возвращает список, вы должны вызвать 'ToList' для создания нового списка. Возникает вопрос, как использовать 'List.Sort' с' IList 'вместо' List '? –

+2

Вам нужно будет создать метод 'Sort' и использовать его. Возьмите один из тех, что используются Mono, например. – xanatos

ответ

-1

Я подозреваю, что вы имеете в виду тот факт, что ваш OrderBy не будет компилироваться. Это потому, что она возвращает IOrderedEnumerable, который не является IList, вы должны выполнить ToList() впоследствии преобразовать его обратно в IList реализации:

var sortedIList = unsortedIList.OrderBy(x => x.SortingValue).ToList(); 

И если вы хотите использовать свой собственный IComparer:

var sortedIList = unsortedIList.OrderBy(x => x.SortingValue, new MyComparer()).ToList(); 
+3

Это не отвечает на вопрос, так как он не сортирует 'unsortedIList' * на месте * –

-1

«Я могу сортировать его в новый список, используя» нет, это не тот случай, OrderBy оленья кожа возвращает список, вы должны вызвать ToList, чтобы создать новый список. На ваш вопрос, как использовать List.Sort с IList<T> вместо List<T>?

Вы можете написать метод расширения для IList<T>:

public static IList<T> Sort<T>(this IEnumerable<T> sequence, IComparer<T> comparer = null) 
{ 
    var seqList = sequence as List<T>; 
    if (seqList != null) 
    { 
     seqList.Sort((IComparer<T>)comparer); 
     return seqList; 
    } 

    var seqArray = sequence as T[]; 
    if (seqArray != null) 
    { 
     Array.Sort(seqArray, (IComparer<T>)comparer); 
     return seqArray; 
    } 

    return sequence.OrderBy(t => t, (IComparer<T>)comparer).ToList(); 
} 

Теперь вы можете использовать Sort на списки, массивы или любой другой вид последовательности:

IList<string> strings = new[] { "B", "A", "C" }; 
strings.Sort(); 

Update: если вы просто хотите один для массивов или списков, которые вы можете использовать:

public static void Sort<T>(this IList<T> sequence, IComparer<T> comparer = null) 
{ 
    var seqList = sequence as List<T>; 
    if (seqList != null) 
    { 
     seqList.Sort((IComparer<T>)comparer); 
     return; 
    } 

    var seqArray = sequence as T[]; 
    if (seqArray != null) 
    { 
     Array.Sort(seqArray, (IComparer<T>)comparer); 
    } 
} 
+2

Кажется, что это немного запутанное поведение. Он сортируется для 'List ' и 'T []', но он возвращает новый список для чего-либо еще. –

+0

@CharlesMager: вы можете сделать параметр «IList » и удалить «return sequence.OrderBy (t => t, (IComparer )) .ToList()', если вы этого не хотите. Я просто хотел включить его, потому что OP упомянул об этом.Это всеобъемлющий подход. Тогда возвращаемое значение также является избыточным. –

+0

Тогда у вас будет проблема «не все пути кода возвращать значение» как «IList ! = Список ' - вот суть проблемы. Как вы сортируете 'IList ' на месте, когда это может быть не 'List '? –

0

Написать свой собственный метод расширения, используя ArrayList.AdapterIList<T>, как обертка и собственный CustomComparer начиная с некоторого Comparison делегата:

public static class IListExtensions 
{ 
    public static void Sort<T>(this IList<T> list, Comparison<T> comparison) 
    { 
     ArrayList.Adapter((IList)list).Sort(new CustomComparer<T>(comparison)); 
    } 
} 
+0

Почему -1? Какова цель -1 без объяснения причин? –

+0

Мне это действительно нравится, но не удалось найти «CustomComparer» в рамках. Вместо этого я использовал 'Comparer .Create (сравнения)', который, похоже, делает то, что здесь предназначено. – dana