2017-05-31 94 views
0

由於數據結構的性質,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 
      } 
    } 
} 

回答

0

使用上SortedList<TKey, TValue>Values屬性來獲取所有值的IList<TValue>在排序列表。然後,您可以通過索引獲得該值,這是O(1)操作,例如, mySortedList.Values[i]

https://msdn.microsoft.com/en-us/library/ms132380(v=vs.110).aspx

如果你的值類型是一個結構,你可以把它用ref新屬性值一起的方法和更新方法的屬性。儘管如此,我們不推薦使用可變結構:pass c# struct by reference?

+0

是的,我可以按照您的建議,按示例代碼中所示的索引獲取值。問題是關於通過索引設置值。嘗試通過IList.Values進行設置會引發「此操作在SortedList嵌套類型上不受支持,因爲它們需要修改原始SortedList。」錯誤 –

+0

我已經編輯了答案,可以設置值的可能性。這可能不是理想的解決方案,但希望有些食物可供思考。 – ZippyZippedUp