2015-06-19 117 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.SortIList<T>而不是List<T>

你可以寫一個擴展方法IList<T>

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

更新

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如果你只是想一個數組或列表,你可以使用:

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的'和'刪除返回sequence.OrderBy(T => T,(IComparer的)比較器).ToList()'如果你不希望出現這種情況。我只是想包括它,因爲OP已經提到它。這是包羅萬象的方法。返回值也是多餘的。 –

+0

然後,你會'IList !=列表''這不是所有的代碼路徑都返回一個值'的問題 - 這真的是問題的關鍵。當它可能不是'List ''時,你如何排序'IList '? –

0

編寫使用ArrayList.Adapter作爲IList<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'。相反,我用'比較器。創建(比較)'這似乎做了這裏的目的。 – dana