如果我只希望能夠索引到一個類型的實例,應該使用什麼C#接口?我不需要(或想要)添加/刪除/編輯元素的能力。枚舉是可以的。這是否需要自定義IIndexable
類型?可索引接口
在這種情況下IList
是矯枉過正,因爲它強制執行我不想擁有的成員。
如果我只希望能夠索引到一個類型的實例,應該使用什麼C#接口?我不需要(或想要)添加/刪除/編輯元素的能力。枚舉是可以的。這是否需要自定義IIndexable
類型?可索引接口
在這種情況下IList
是矯枉過正,因爲它強制執行我不想擁有的成員。
IList<>
(假設你想保持通用)是唯一包含索引器的接口。
但是,您可以明確地實施並拋出NotSupportedException
以進行所有您不想支持的操作,或者僅實現IEnumerable<>
,其餘的僅在類中,而不是在接口中。
爲什麼不只是IEnumerable<>
+只有索引器的自定義界面?
,因爲您無法寫入IEnumerable ...但是,使用IList可以做到這一點。 – 2017-02-09 13:14:08
您可以將其公開爲IEnumerable<T>
,並且仍然通過LINQ .ElementAt
和.Count
具有索引行爲。如果底層集合支持IList<T>
,那麼這些仍然是O(1)操作,因爲LINQ足夠智能,可以爲列表實現進行優化。當然,.ElementAt
不如索引器簡潔,但它也爲您提供了靈活性,如果底層實現更改爲不直接支持索引的集合。如果您不想使用此方法,則創建實現只讀索引器的包裝類並將所有調用委託給基礎列表並不困難。
隨着.NET 4.5的(可以說)正道,現在是使用IReadOnlyList<T>
,從IReadOnlyCollection<T>
派生,它從IEnumerable<T>
IReadOnlyList<T>
派生爲您提供了索引IReadOnlyCollection<T>
給你收集計數屬性。IEnumerable<T>
爲您提供集合枚舉器。它就像你可以做到的一樣輕。
核心類直接實現IReadOnlyList
:
+1這是.NET 4.5+的最佳方法。泛型集合('List
定義自定義類它,你可以在你的界面使用
public class Indexable<T>
{
private readonly IList<T> _innerList;
public Indexable(IList<T> innerList)
{
_innerList = innerList;
}
public T this[int index]
{
get { return _innerList[index]; }
set { _innerList[index] = value; }
}
}
使用它作爲
public interface MyStuff
{
Indexable<int> MyIndexableCollectionOfInt { get; }
}
你需要與任何現有的接口兼容?如果沒有,爲什麼不直接使用索引器創建自己的界面? – 2010-06-29 14:46:17