[注意:這個問題已經吸引了低運行時性能的解決方案,所以值得強調的是除了類型安全之外,性能是關鍵。更多性能信息請參見末尾的註釋。]將編譯時安全性添加到C#列表索引器 - 這可能嗎?
我在一個相當複雜的算法中使用List<int>
的幾個不同實例。
其中一些列表包含相互間的索引,即它們提供間接級別。
我修復了訪問列表時使用錯誤索引器導致的一些錯誤。因爲所有的列表都是相同的類型,即List<int>
,編譯器根本不提供任何類型的安全。例如:
// The below statement is wrong - it should be list1[list2[x]],
// as x is an index into list2, not list1.
// list2 returns indexes into list1.
// But the compiler is oblivious to this.
//
var f = list1[x];
於是,我就開始想,這可能是通過使用強類型的索引到每個列表,只是換一個整數增加一定程度的類型安全的:
/// An index into the first list
struct Index1
{
public int Value { get; set; }
}
/// An index into the second list
struct Index2
{
public int Value { get; set; }
}
然後,聲明正確索引類型的變量將在編譯時捕獲一類錯誤。 (這並非萬無一失,這不是我所追求的 - 更好就是了。)
不幸的是,通用List<T>
沒有提供使用自定義索引類型的方法 - 索引器總是一個int類型。
有沒有另一種方法可以完成我想要做的事情?想到一個自定義的集合 - 我不介意的努力,這可能會支付自己。但我想不出可以如圖所示使用的一種。 (當然,我可以爲每個索引器創建一個單獨的集合類型 - 但如果可能的話,我希望使用單個新集合類型,因爲否則代碼複製開始成爲問題。)
性能::該算法被重寫爲使用性能列表。我們甚至考慮使用數組,因爲有一個更少的邊界檢查。因此,任何建議的解決方案都應具有出色的運行時性能 - 至少可以達到List<T>
。
因此,結構(或任何其他技術)理想情況下應在編譯時類型安全檢查後進行優化。
使用案例: 使用情況是:
- 通過一種安全的索引從列表訪問隨機元素。
- A for循環列表,也使用類型安全索引器。
- 在列表中使用foreach。 List優化其GetEnumerator()以返回一個結構,因此避免分配。我想保留這一點。
澄清上面。 – bright
您是否需要保留排序,或者您是否只需要按索引訪問元素? – driis
您是否意味着在每個系列中訂購 - 是的,這非常重要。爲什麼? – bright