2011-05-13 7 views
1

Hi J'ai créé un tableau générique qui fonctionne très bien pour Int, String, Float ou même mon propre type nommé Customers.Indexeur dans Generic Array

Le tableau générique a des fonctions Add(), Sort(), ShowAll() qui fonctionne très bien pour Int, String, et même le type de client sauf quand j'essaye de montrer la méthode() CustomerType qui montre toutes les valeurs que je ont ajouté via la méthode ADD().

sortie

est quelque chose comme GenericArray.Customer

pas les valeurs alors que je voulais avoir les valeurs.

je l'ai résolu par

public class GArray<T> where T : Customer

mais maintenant je ne peux pas créer une matrice générique de type Int, Float.

ici est le ADD et la méthode ShowAll de classe

public void Add(T temp) 
     { 

      if (index >= values.Length) 
      { 
       T[] tempArray = new T[values.Length + 1]; 
       Array.Copy(values, tempArray, values.Length); 
       values = tempArray; 
      } 
      values[index] = temp; 
      index++; 
     } 

public void ShowAll() 
    { 
     for (int i = 0; i < values.Length; i++) 
     { 
      Console.WriteLine(values[i]);     
     } 
    } 

les valeurs m ajoutant

static void Main(string[] args) 
     {       
      GArray<Customer> customers = new GArray<Customer>(3); 
      customers.Add(new Customer(101, "xyz")); 
      customers.Add(new Customer(59, "abc")); 

      customers.ShowAll(); 
      } 

j'ai parlé avec mon frnd et il a dit que je dois créer indexeur mon moi. quelqu'un peut m'aider comment puis-je créer un indexeur dans ce cas qui fonctionne bien pour customerType ou tout type.

+0

ajouté C# .NET et balises – sehe

+0

lmgtfy? http://msdn.microsoft.com/en-us/library/aa288465(v=vs.71).aspx – sehe

+0

Par indexeur, voulez-vous dire énumérateur ou une fonction 'GetValueByIndex (int)'? – Jodrell

Répondre

2

Je pense que, si je comprends la question (sortie est quelque chose comme GenericArray.Customer, pas les valeurs alors que je voulais avoir les valeurs) vous devez ajouter à la définition du client:

public override string ToString() 
{ 
    // return something you want to show to identify your customer 
    // e.g. return Name; 
    return ...   
} 

J'explique: lorsque vous utilisez Console.WriteLine(values[i]), vous indiquez à C# d'écrire sur l'objet client console ... et il écrit alors le nom de la classe, car c'est le comportement par défaut.
Définir dans la classe Customer la chaîne par défaut à convertir pour faire ce que vous voulez ...

+0

Vous n'avez pas besoin d'ajouter l'appel ToString à l'appel Console.WriteLine - Console.WriteLine appelle déjà ToString. L'implémentation par défaut, dans System.Object, affiche simplement le nom de la classe. Tout ce que l'OP doit faire est d'ajouter le remplacement. – phoog

+0

U compris question Rite et votre solution a résolu mon problème Merci pour votre aide .. Merci beaucoup :) Vous avez sauvé ma vie: d – Salman

+0

@ user751959: si je pouvais vraiment sauver la vie juste en tapant sur mon clavier, il sera vraiment super!!! ;) Heureux de vous aider :) – Marco

0
public T this[int index] 
{ 
    get {return values[index]; } 
} 
+0

J'ai essayé votre solution, mais il n'a pas aidé m'a pu élaborer plus. il serait bon que je sois capable de le résoudre via les indexeurs – Salman

0

Je pense que votre problème est que vous n'avez pas remplacé ToString dans votre classe de client. Faites cela - cela définira comment les objets doivent être affichés dans la console.

+0

Je pense la même chose et j'ai déjà posté du code ... cela me fait penser que j'ai compris la question :) – Marco

+0

Merci Phoog et Marco :) ça a résolu mon problème :) – Salman

+0

Ouais, je tape sur mon téléphone, il m'a fallu beaucoup de temps pour obtenir cette réponse courte. :-( – phoog

0

Votre problème réel de côté pour un moment, je voudrais mentionner qu'il n'y a pas de place pour une méthode ShowAll dans une mise en œuvre de tableau. Pourquoi un tableau devrait-il être lié à une application console? Ne voudriez-vous pas le réutiliser pour une application Windows Forms un jour sans qu'il soit nécessaire de le réécrire?

Ensuite, .NET a déjà un List<T> qui effectue l'allocation dynamique si nécessaire. Si vous voulez l'écrire vous-même, au moins allouer le tableau en plus grandes étapes (n * 2 à chaque fois).

Pour supprimer la méthode ShowAll du tableau (où il ne fait pas partie), vous devriez envisager de prendre l'une des approches suivantes:

a) Créer une méthode d'extension qui fonctionne pour tout IEnumerable<T> (une liste, Array, Collection, peu importe):

public static class EnumExt 
{ 
    public static void ShowAll<T>(this IEnumerable<T> list) 
    { 
     foreach (T item in list) 
      Console.WriteLine(item); 
    } 
} 

Utilisation:

int[] array = new int[] { 1,2,3}; 
array.ShowAll(); 

b) Ou, encore plus abstraite et de créer un ForEach méthode d'extension où vous passerez un delegate arbitraire pour effectuer le travail réel:

public static class EnumExt 
{ 
    public static void ForEach<T>(this IEnumerable<T> list, Action<T> action) 
    { 
     foreach (T item in list) 
      action(item); 
    } 
} 

Utilisation:

int[] array = new int[] { 1,2,3}; 
// now you are reusing the iterator 
// for any action you want to execute 
array.ForEach(Console.WriteLine); 
// or 
array.ForEach(item => Console.WriteLine("My item is: " + item));