由於數據結構的性質,System.Collections.SortedList的SetByIndex方法便宜,O(1)。該類的通用版本沒有SetByIndex方法。我正在尋找System.Collections.Generic中的SortedList實現的等效操作。SetByIndex相當於System.Collections.Generic.SortedList
這兩個類都使用排序數組實現字典。由於底層結構是一個數組,因此可以通過索引有效地訪問條目。非通用版本還提供了一個GetByIndex方法,該方法通過索引(而不是密鑰)檢索值。通用SortedList還支持通過.Values屬性進行索引檢索。當我嘗試通過.Values屬性修改元素時,我得到一個異常,指出「SortedList嵌套類型不支持此操作,因爲它們需要修改原始SortedList。」我不是專注於面向對象的設計,但爲什麼不讓我通過SortedList返回的「嵌套類型」修改值?
對於這個項目,我在.NET 4.0上。我需要SortedList,這樣我才能按排序順序遍歷這些項目。根據配置文件,程序中非常昂貴的調用樹包括通過索引遍歷一堆小SortedLists中的項目(以及按鍵的排序順序)並修改某些值。目前爲了執行該值修改步驟,我必須使用密鑰進行分配,其中涉及log(n)個字符串比較操作來定位適當的時隙,而不是簡單地通過索引(即SetByIndex)來指定值,這將是零比較。我沒有改變密鑰,所以沒有什麼會影響數組中值的位置。
在System.String.CompareTo(字符串)中花費的總體程序時間爲19%(獨佔),幾乎所有程序都來自修改值的方法。
示例代碼來說明:
class Container
{
readonly System.Collections.Generic.SortedList<string, MapEntryValueType> map;
void Merge(IncomingData data)
{
for(int i=0; i < map.Count; i++)
if(data.ExamineKeyForMatch(map.Keys[i])) //O(1)
{
MapEntryValueType entry = map.Values[i]; //O(1)
entry.something = data.something;
//map.Values[i] = entry; //O(1) no can do, error "This operation is not supported..."
//map.SetByIndex(i, entry); //O(1) no can do, no such method
map[map.Keys[i]] = entry; //O(log n) yucky and slow but works
}
}
}
是的,我可以按照您的建議,按示例代碼中所示的索引獲取值。問題是關於通過索引設置值。嘗試通過IList.Values進行設置會引發「此操作在SortedList嵌套類型上不受支持,因爲它們需要修改原始SortedList。」錯誤 –
我已經編輯了答案,可以設置值的可能性。這可能不是理想的解決方案,但希望有些食物可供思考。 – ZippyZippedUp