2011-01-31 3 views
2

Je suis en train d'obtenir array[i] de la classe B à ma classe A.C# Passing tableaux entre classe A et classe B

En classe BI ont:

public array getArray() { 
    return array[i]; 
} 

Comment puis-je obtenir le plein array à faire ce travail?

combobox1.items.add(getArray()); 

J'essaie cela, mais cela ne fonctionne pas. Pouvez-vous s'il vous plaît répondre avec un exemple de code qui explique deux méthodes dans différentes classes qui envoient et obtiennent array[i].

+0

Quelques * terribles * réponses à cette question. – tomfanning

Répondre

-1

Vous avez à parcourir votre tableau:

foreach(var item in GetArray()) 
{ 
    combobox1.Items.Add(item); 
} 
+0

Eh bien, si j'ai bien compris foreach (var article de ClassB.GetArray()) { combobox1.Items.Add (item); } en référence à classb? – Ivan

+0

La même chose que ci-dessus: Ceci est sale. Dans le monde orienté objet, vous ne devriez jamais renvoyer votre tableau interne directement. -1 –

1

Vous devez donner class A accès à l'ensemble du réseau et non pas seulement une seule valeur. Par exemple

class B { 
    Object[] _array; 
    public Object[] GetArray() { 
    return _array; 
    } 
} 

Maintenant class A peut consommer tous les éléments et remplir complètement la zone de liste déroulante

foreach (object element in classBInstance.GetArray()) { 
    combobox1.Items.Add(element); 
} 
+1

C'est sale. Dans le monde orienté objet, vous ne devriez jamais renvoyer votre tableau interne directement. -1 –

+1

@Al l'utilisateur semble être relativement nouveau dans la langue et par conséquent j'opte pour la solution la plus simple. – JaredPar

+0

En fait, le code le plus direct serait une propriété: public Object [] MyArray {get; ensemble privé; } dans la classe B. – knight0323

-1

Eh bien votre exemple, vous avez i, mais ce ne est pas lancé partout, vous devez passer comme ça :

public array getArray(int i) 
{ 
    return array[i]; 
} 



combobox1.items.add(getArray(5)); 
+0

La même chose que ci-dessus: Ceci est sale. Dans le monde orienté objet, vous ne devriez jamais renvoyer votre tableau interne directement. -1 –

-1

Votre question n'est pas très claire, alors je vais essayer de répondre en fonction de ce que j'ai compris être votre problème.

class A 
{ 
    string[] array; 
    public string[] GetArray() { return array; } 
} 

alors vous pouvez écrire du code comme celui-ci pour remplir un combobox

A items = new A(); 
// fill in array in A 
comboBox1.DataSource = items.GetArray(); 

ou

foreach(string item in items) 
{ 
    comboBox1.Items.Add(item); 
} 

je fais des listes définies à l'aide du membre DataSource tout le temps, surtout quand on passe de enum s aux cordes.

Exemple:

comboBox1.DataSource = System.Enum.GetNames(typeof(System.DayOfWeek)); 
+0

La même chose que ci-dessus: Ceci est sale. Dans le monde orienté objet, vous ne devriez jamais renvoyer votre tableau interne directement. -1 –

+0

@AlKepp vous faites quand vous vous souciez de la vitesse, et ne pas avoir à copier des valeurs 10 000 fois par seconde. Pas tout le monde construit du code bancaire, qui a besoin de ce niveau de sécurité. Épargnez-moi l'idéalisme OOP, et répondez de façon réaliste à la question posée. – ja72

-2

Bien que d'autres réponses travaillent sur le plan technique, à mon avis, on ne devrait jamais retourner un tableau interne directement, car il va à l'encontre des bonnes pratiques dans la programmation orientée objet. Donc j'implémenterais l'interface IEnumerable dans cette classe ou au moins retournerais IEnumerator ou IEnumerable ce qui rendrait la collection retournée en lecture seule.

Exemple:

class ClassB { 
    int[] array; 
    public IEnumerable<int> GetValues() { return array; } 
} 

class ClassA { 
    void DoTheJob(ClassB source) { 
    foreach(int item in source.GetValues()) { 
     combobox.Items.Add(item); 
    } 
    } 
} 

Une autre solution propre est d'utiliser la fonctionnalité « voir avec les valeurs » à la classe B. Ensuite, nous fournissons simplement délégué.Exemple:

class ClassB { 
    int[] array; 
    public void DoWithValues(Action<int> action) { 
    foreach(int item in array) action(item); 
    } 
} 

class ClassA { 
    ComboBox combobox; 
    void DoTheJob(ClassB source) { 
    source.DoWithValues(item => combobox.Items.Add(item)); 
    } 
} 

La prochaine (troisième) exemple montre comment faire toute ClassB dénombrable avec foreach:

static void Main(string[] args) { 
    ClassB b = new ClassB(); 
    foreach(int i in b) Console.Write(i + " "); 
} 

class ClassB : IEnumerable<int> { 

    int[] array; 

    public ClassB() { 
    array = new int[20]; 
    } 

    public IEnumerator<int> GetEnumerator() { 
    return (array as IEnumerable<int>).GetEnumerator(); 
    } 

    IEnumerator IEnumerable.GetEnumerator() { 
    return array.GetEnumerator(); 
    } 
} 

mise à jour: Comme ja72 montré, cette technique simple qui publie tout recenseur du tableau interne , ne masque pas physiquement le tableau, car IEnumerator résultant peut être renvoyé à int []. Mon frère utilise toujours Clone() pour renvoyer une copie du tableau

mise à jour # 2: C'est le plus lent, mais il a dit qu'il a sauvé sa carrière plusieurs fois (il travaille sur un projet plus important dans une équipe).

+0

Pouvez-vous montrer un exemple d'interface IEnumerable parce que j'ai googlé mais n'a jamais eu un coup le donne une réponse directe – Ivan

+0

Ivan, si vous avez un tableau interne, vous pouvez le retourner comme IEnumerable. Regardez la méthode GetValues ​​() dans mon premier exemple. C'est le moyen le plus facile. Je vais montrer une autre possibilité (rendant toute la classe B enumerable) dans le troisième exemple. –

+1

-1. Votre code suppose que 'class A' est un wrapper (peut avoir un seul collection/tableau qu'il représente) ou il retourne le tableau (masqué comme' IEnumarable <> 'qui peut toujours corrompre le tableau original et est contre les principes OOP (par votre comments) Vous pouvez toujours faire 'int [] list = (int []) GetValues ​​()' – ja72

Questions connexes