2010-06-29 8 views
13

¿Qué interfaz de C# debería usarse si solo deseo poder indexar instancias de un tipo? No necesito (o quiero) la capacidad de agregar/eliminar/editar elementos. La enumeración está bien. ¿Esto requiere un tipo personalizado IIndexable?Interfaz indexable

En este caso IList es exagerado porque obliga a la implementación de los miembros que no quiero tener.

+0

¿Es necesario ser compatible con las interfaces existentes? Si no, ¿por qué no simplemente crear su propia interfaz con un indexador? –

Respuesta

11

IList<> (suponiendo que quiera seguir siendo genérico) es la única interfaz que incluye un indexador.

Sin embargo, puede implementar y lanzar explícitamente NotSupportedException para todas las operaciones que no desea admitir, o simplemente implementar IEnumerable<> y tener el resto en la clase solamente, no en una interfaz.

1

¿Por qué no solo IEnumerable<> + una interfaz personalizada con solo un indexador?

+0

porque no puede escribir en un IEnumerable ...Sin embargo, usando IList esto podría hacerse. –

3

Puede exponerlo como IEnumerable<T> y seguir teniendo un comportamiento de indexación a través de LINQ .ElementAt y .Count. Si la colección subyacente es compatible con IList<T>, estas siguen siendo operaciones O (1) ya que LINQ es lo suficientemente inteligente como para optimizar las implementaciones de listas. Otorgado, .ElementAt no es tan breve como un indexador, pero también le da flexibilidad si la implementación subyacente cambia a una colección que no admite indexación directamente. Si no desea utilizar este enfoque, no es demasiado difícil crear una clase contenedora que implemente un indexador de solo lectura y delegue todas las llamadas en una lista subyacente.

15

A partir de .Net 4.5 el camino (discutible) justo ahora es utilizar IReadOnlyList<T>, que deriva de IReadOnlyCollection<T>, que deriva de IEnumerable<T>

  • IReadOnlyList<T> le da el indexador
  • IReadOnlyCollection<T> le da el conde colección propiedad.
  • IEnumerable<T> le ofrece la recopilación Enumerador.

Es casi tan ligero como usted puede hacerlo.

Las clases principales que implementan directamente IReadOnlyList:

+1

+1 Ese es el mejor enfoque para .NET 4.5+. Las colecciones genéricas ('List ') y las matrices ('T []') implementan 'IReadOnlyList ', por lo que se pueden pasar de forma transparente, lo que las hace inmutables para los consumidores. Implementé mi propia versión de ['IIndexable '] (http://www.codeproject.com/Articles/233738/IIndexable-a-true-read-only-list-interface) hace varios años, que ahora está obsoleta. – Groo

0

definir una clase personalizada por ello que se puede utilizar en su interfaz

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

utilizarlo como

public interface MyStuff 
{ 
    Indexable<int> MyIndexableCollectionOfInt { get; } 
}