2010-10-26 3 views
1

J'ai un tableau 2d d'une classe. La taille de la matrice est très grande (environ 3000 * 3000) et l'accès au tableau avec une méthode de ligne et de colonne ordinaire prend beaucoup de temps. Pour ce faire, je veux utiliser des pointeurs pour accéder au tableau.Accès tableau 2d avec point dans wpf C#

Après mon code de tableau:

définition de classe:

Class BoxData  
{ 
    Size _bound; 
    bool _isFilled=false; 
    Color _color=Colors.White; 

    public Size Bounds 
    { 
    get 
    { 
     return _bound; 
    } 
    set 
    { 
     _bound=value; 
    } 
    } 

    public bool IsFilled 
    { 
    get 
    { 
     return _isFilled; 
    } 
    set 
    { 
     _isFilled=value; 
    } 
    } 

    public Color FillColor 
    { 
    get 
    { 
     return _color; 
    } 
    set 
    { 
     _color=value; 
    } 
    } 
} 

classe utilisé comme tableau dans l'application:

BoxData[,] boxData=new BoxData[3000,3000]; 

Je veux accéder boxData avec des pointeurs.

Merci

+1

non pas! ... :) Suggérez que vous postez le code (chronométré) qui cause le problème. –

+0

Avez-vous essayé d'utiliser un dictionnaire de valeurs clés en utilisant une clé calculée à l'aide des coordonnées XY? – Larry

+0

@Mitch: Je viens d'obtenir les limites et les couleurs du tableau en utilisant la boucle. –

Répondre

2

Essayez un tableau en dents de scie au lieu d'un à plusieurs dimensions, ils sont faster dans la mise en œuvre du CLR de Microsoft

BoxData[][] boxData=new BoxData[3000][]; 
for (int i=0; i<3000; i++) 
    boxData[i] = new BoxData[3000];  
+0

Bon conseil, mais vous devriez dire pourquoi. –

+0

Merci, je l'ai fait plus clair –

2

Peut-être que vous pourriez utiliser une struct au lieu d'une classe pour BoxData?

Struct est un type de valeur: lorsque vous déclarez votre tableau, tout sera déjà rempli. Vous n'utiliserez plus de boucle pour créer des instances new BoxData().

var x = new BoxData[3000,3000]; // Populated array of BoxData 

En raison de struct vs restrictions de classe, vous devrez enlever initializers cette façon ...

struct BoxData 
{ 
    Size _bound; 
    bool _isFilled; // = false; 
    Color _color; // = Color.White; 

    public Size Bounds 
    { 
     get 
     { 
      return _bound; 
     } 
     set 
     { 
      _bound = value; 
     } 
    } 

    public bool IsFilled 
    { 
     get 
     { 
      return _isFilled; 
     } 
     set 
     { 
      _isFilled = value; 
     } 
    } 

    public Color FillColor 
    { 
     get 
     { 
      return _color; 
     } 
     set 
     { 
      _color = value; 
     } 
    } 
} 

... et initialiser vos valeurs par défaut en utilisant une boucle sera beaucoup plus rapide.

for (int j = 0; j < 3000; j++) 
    for (int i = 0; i < 3000; i++) 
     x[i, j].FillColor = Color.White;