2010-06-29 25 views
13

如果我只希望能夠索引到一個類型的實例,應該使用什麼C#接口?我不需要(或想要)添加/刪除/編輯元素的能力。枚舉是可以的。這是否需要自定義IIndexable類型?可索引接口

在這種情況下IList是矯枉過正,因爲它強制執行我不想擁有的成員。

+0

你需要與任何現有的接口兼容?如果沒有,爲什麼不直接使用索引器創建自己的界面? – 2010-06-29 14:46:17

回答

11

IList<>(假設你想保持通用)是唯一包含索引器的接口。

但是,您可以明確地實施並拋出NotSupportedException以進行所有您不想支持的操作,或者僅實現IEnumerable<>,其餘的僅在類中,而不是在接口中。

1

爲什麼不只是IEnumerable<> +只有索引器的自定義界面?

+0

,因爲您無法寫入IEnumerable ...但是,使用IList可以做到這一點。 – 2017-02-09 13:14:08

3

您可以將其公開爲IEnumerable<T>,並且仍然通過LINQ .ElementAt.Count具有索引行爲。如果底層集合支持IList<T>,那麼這些仍然是O(1)操作,因爲LINQ足夠智能,可以爲列表實現進行優化。當然,.ElementAt不如索引器簡潔,但它也爲您提供了靈活性,如果底層實現更改爲不直接支持索引的集合。如果您不想使用此方法,則創建實現只讀索引器的包裝類並將所有調用委託給基礎列表並不困難。

15

隨着.NET 4.5的(可以說)正道,現在是使用IReadOnlyList<T>,從IReadOnlyCollection<T>派生,它從IEnumerable<T>

  • IReadOnlyList<T>派生爲您提供了索引
  • IReadOnlyCollection<T>給你收集計數屬性。
  • IEnumerable<T>爲您提供集合枚舉器。

它就像你可以做到的一樣輕。

核心類直接實現IReadOnlyList

+1

+1這是.NET 4.5+的最佳方法。泛型集合('List ')和數組('[T []')都實現了'IReadOnlyList ',所以它們可以透明傳遞,有效地使它們對消費者不變。幾年前,我實現了自己的['IIndexable '](http://www.codeproject.com/Articles/233738/IIndexable-a-true-read-only-list-interface),現在已經過時了。 – Groo 2015-06-27 12:51:31

0

定義自定義類它,你可以在你的界面使用

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; } 
}