Индексатор в универсальном массиве - PullRequest
1 голос
/ 13 мая 2011

Привет, я создал универсальный массив, который отлично работает для Int, String, Float или даже для моего собственного типа с именем Customers.

Общий массив имеет функции Add (), Sort (), ShowAll (), которые прекрасно работают для Int, String и даже Customer Type, за исключением случаев, когда я пытаюсь вызвать метод 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]);                
        }
    }

значения m, добавляющие

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

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

Ответы [ 4 ]

2 голосов
/ 13 мая 2011

Я думаю, если я понимаю вопрос (вывод является чем-то вроде 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 голосов
/ 13 мая 2011

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

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

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

a) Создайте метод расширения, который работает для любого 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();

b) Или, быть еще более абстрактным, и создать метод расширения 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));
0 голосов
/ 13 мая 2011

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

0 голосов
/ 13 мая 2011
public T this[int index]
{
  get {return values[index]; }
}
...