2012-11-16 54 views
0

我的代碼中有SortedList。我在裏面填寫關鍵值對。當我向SortedList添加項目時,它會按鍵自動排序。但我需要按價值對其進行排序。因爲這些值是組合框中的可見文本。它們必須按字母順序排序。我決定寫一門課並繼承SortedList課,並覆蓋Add方法。如何覆蓋SortedList添加按值排序的方法

但是,當我看着Microsoft's SortedList class的代碼,我看到有一個Insert方法,它使排序,不幸的是它是私人的,所以我不能重寫它。你能幫我解答嗎?

注:我不能使用ArrayListDictionary或其他東西。我無法管理我們項目中的所有代碼。我必須返回'SortedList'或'MySortedList'來自SortedList

+0

你有什麼的任何要求調用私有插入鑰匙必須是?如果不是,那麼爲什麼不只是將您的文本添加爲​​鍵和值? 'sortedList.Add(text,text)' – Douglas

+0

是的,第一個參數必須是關鍵字,第二個參數必須是值。它取決於我們的項目中的其他類 –

+0

可能重複的[C#按值排序列表](http://stackoverflow.com/questions/16649481/c-sharp-sorted-list-by-value-with-object) – nawfal

回答

2

我的第一個建議是使用自定義比較器,但他沒有解決問題。因此,我調查了排序列表implementaion更詳細和替代我原來的職位有以下建議:

重寫Add方法,使用反射應該做的伎倆

private MySortedList() 
{ 
} 

public override void Add(object key, object value) 
{ 
    if (key == null || value == null) 
    { 
     //throw new ArgumentNullException("key", Environment.GetResourceString("ArgumentNull_Key")); 
     throw new ArgumentNullException(); // build your own exception, Environment.GetResourceString is not accessible here 
    } 

    var valuesArray = new object[Values.Count]; 
    Values.CopyTo(valuesArray , 0); 

    int index = Array.BinarySearch(valuesArray, 0, valuesArray.Length, value, _comparer); 
    if (index >= 0) 
    { 
     //throw new ArgumentException(Environment.GetResourceString("Argument_AddingDuplicate__", new object[] { this.GetKey(index), key })); 
     throw new ArgumentNullException(); // build your own exception, Environment.GetResourceString is not accessible here 
    } 

    MethodInfo m = typeof(SortedList).GetMethod("Insert", BindingFlags.NonPublic | BindingFlags.Instance); 
    m.Invoke(this, new object[] {~index, key, value}); 
} 
+0

謝謝。你有任何示例代碼來編寫我自己的比較器? –

+0

我們正在討論經典的SortedList,而不是通用的SortedList ,對不對? –

+0

不幸的是,我認爲這不會起作用。自定義比較器只能看到來自'SortedList'的鍵,而不是值。 – Douglas