2009-10-02 7 views

Répondre

7

ReadOnlyCollection est une collection unidimensionnelle. Vous pouvez faire un ReadOnlyCollection<ReadOnlyCollection<int>>, ou faire votre propre classe deux dimensions d'emballage, quelque chose comme:

public class ReadOnlyMatrix<T> { 

    private T[,] _data; 

    public ReadOnlyMatrix(T[,] data) { 
     _data = data; 
    } 

    public T this[int x, int y] { 
     get { 
     return _data[x, y]; 
     } 
    } 

} 
-1

Je ne suis pas tout à fait sûr que je comprends la direction que vous prenez, mais en fonction de votre description de ce que vous essayez d'accomplir, il me semble que vous pouvez juste faire ce qui suit:

private int[,] _table = new int[9, 9]; 
public int[,] Table 
{ 
    get 
    { 
     return _table; 
    } 
} 
+0

que toute façon peut faire MyClass.Table [0,0] = 1111; –

+0

Gotcha ... a plus de sens maintenant. –

3

Le problème est que vous essayez d'envelopper une structure mutable 2D avec un 1D en lecture seule structure. Vous aurez besoin de plusieurs niveaux d'imbrication pour accomplir ceci.

ReadOnlyCollection<ReadOnlyCollection<int>>

L'inconvénient de cette approche est cependant que ce sera essentiellement vous forcer à avoir la table entière en mémoire deux fois. ReadOnlyCollection<T> nécessite un List<T> comme seul argument constructeur. Ainsi, vous finirez par copier chacune de vos lignes dans un nouveau List<int>.

Une autre façon d'accomplir ceci est d'utiliser un indexeur de propriétés pour renvoyer la valeur directement sans permettre la mutation.

public int this[int i, int j] { 
    get { return _table[i,j]; } 
} 

Ceci permet aux consommateurs de lire les données sans devoir les muter.

2

Vous pouvez faire quelque chose comme:

public class ReadOnly2DArray<T> 
{ 
    T[,] _array; 
    public ReadOnly2DArray(T[,] arrayToWrap) 
    { 
     _array = arrayToWrap; 
    } 

    public T this[int x, int y] 
    { 
     get { return _array[x, y]; } 
    } 
} 

ajoutant éventuellement d'autres méthodes de la classe Array (propriété de longueur, méthode GetLength, ...) si vous en avez besoin.

Vous souhaitez alors utiliser quelque chose comme:

int[,] a = new int[2, 2]; 
    ReadOnly2DArray<int> wrapper = new ReadOnly2DArray<int>(a); 

    int value = wrapper[0, 0]; // Can read values 
    //wrapper[0, 0] = value;  // Won't compile 
Questions connexes