2011-05-13 4 views
1

Привет Я создал общий массив, который отлично работает для Int, String, Float или даже моего собственного типа с именем Customer.Indexer в Generic Array

Generic Массив имеет функции Add(), Sort(), SHOWALL() тот работает отлично для Int, String и даже тип клиента кроме случаев, когда я пытаюсь SHOWALL() метод CustomerType, который показывает все значения, которые я добавлены через метод ADD().

выход что-то вроде GenericArray.Customer

не значения, где, как я хотел, чтобы иметь значения.

я решил его через

public class GArray<T> where T : Customer

, но теперь я не могу создать универсальный массив типа Int, Float.

здесь является ADD и метод ShowAll класса

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

значения т добавлением

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

я разговаривал с моим frnd, и он сказал, что я должен создать индексатор мой сам. может ли кто-нибудь помочь мне, как я могу создать индексатор в этом случае, который отлично работает для customerType или любого типа.

+0

добавил C# и .NET теги – sehe

+0

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

+0

По Indexer, вы имеете в виду перечислитель или функцию 'GetValueByIndex (int)'? – Jodrell

ответ

2

Я думаю, если я понимаю вопрос (выход что-то вроде GenericArray.Customer, а не значения, где, как я хотел, чтобы иметь значения) вы должны добавить в определении клиентов:

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

Объяснение: когда вы используете Console.WriteLine(values[i]), вы говорите C# для записи в консольный объект Customer ... и он записывает тогда имя класса, так как это поведение по умолчанию.
Определение в классе Customer строки по умолчанию, которая должна быть преобразована, чтобы сделать то, что вам нравится ...

+0

Вам не нужно добавлять вызов ToString к вызову Console.WriteLine - Console.WriteLine уже вызывает ToString. Реализация по умолчанию в System.Object просто отображает имя класса. Все OP необходимо сделать, это добавить переопределение. – phoog

+0

U понял вопрос Rite и ур Решение решило мою проблему thankz для вашей помощи .. Большое спасибо :) u сохранил мою жизнь: d – Salman

+0

@ user751959: если бы я действительно мог сэкономить жизнь, просто набрав на клавиатуре, это будет действительно здорово !!! ;) Рад помочь вам :) – Marco

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

Я пробовал решение ур, но он не помог мне, может, у PLZ разработать больше. это будет хорошо, если я смогу решить его с помощью индексаторов. – Salman

0

Я думаю, ваша проблема в том, что вы не переопределили ToString в своем классе клиента. Сделайте это - он определит, как объекты должны отображаться в консоли.

+0

Я думаю то же самое, и я уже разместил какой-то код ... это заставляет меня думать, что я понял вопрос :) – Marco

+0

Thanku Phoog и Marco :) он решил мою проблему :) – Salman

+0

Да, я печатаю по телефону, поэтому мне потребовалось много времени, чтобы получить короткий ответ. :-( – phoog

0

Ваша актуальная проблема в сторону на мгновение, я хотел бы упомянуть, что в реализации массива не существует метода ShowAll. Почему массив должен быть привязан к консольному приложению? Не хотите ли вы повторно использовать его для приложения Windows Forms в будущем, не переписывая его?

Затем у .NET уже есть List<T>, который при необходимости выполняет динамическое распределение. Если вы захотите записать его снова самостоятельно, по крайней мере выделите массив большими шагами (n * 2 каждый раз).

Чтобы удалить метод ShowAll из массива (где он не принадлежит), вы должны рассмотреть вопрос о принятии одного из следующих подходов:

а) создать метод расширения, который работает для любого IEnumerable<T> (список, Массив, Коллекция, что угодно):

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

Использование:

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

б) Или, быть еще более абстрактным и создать ForEach метод расширения, где будет проходить произвольное delegate для выполнения фактической работы:

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

Использование:

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