2016-02-01 34 views
2

所以我正在處理HttpRuntime.cache,它返回一個IDictionaryEnumerator作爲它的枚舉器,它似乎與List或Seq不兼容,所以我唯一可以找到的方式是使用它分解成邪惡勢在必行代碼如下所示:F#與IDictionaryEnumerator

member this.GetCountStartsWith keyPrefix = 
      let enumerator = HttpRuntime.Cache.GetEnumerator()     
      let mutable counter = 0 
      while enumerator.MoveNext() do 
       match enumerator.Key.ToString().StartsWith(keyPrefix) with 
       | true -> counter <- counter + 1 
       | false ->() 
      counter 

我本以爲我可以做一個輔助函數來轉儲到列表這一點,但也可能有成千上萬的潛在要素所以這將是一個壞主意性能明智的。任何方式以更習慣的方式處理這件事?

回答

2

問題是你有一個IEnumerator,這是不通用的。但是,有兩種幫助方法可以解決這個問題:OfTypeCast

在實踐中,要像做:

let enumerable = HttpRuntime.Cache |> Seq.cast<DictionaryEntry> 

現在enumerable是一個適當的通用枚舉:)

+0

@Carsten好了,看,上面寫着'公共密封類緩存部分:IEnumerable的':)它編譯,但我實際上沒有爲Web開發獲得F#設置,所以我無法在運行時檢查它。 – Luaan

+0

#DOH ...我可以發誓,那裏曾經是MSDN上的接口部分(當然它正好在那裏明確表示)...對不起人 – Carsten

+0

我不認爲你的代碼是完全正確的,但它和一個現在被刪除的答案讓我走上了解決方案的道路:'HttpRuntime.Cache |> Seq.cast ' – jackmott