-1 голос
 
1174 просмотра
13.04.2017 / 21:31  Витаминыч

Создание своей коллекции с использованием индексаторов

  1. class Products : IEnumerable {
  2.         private ArrayList prodList;
  3.  
  4.         public Products() { prodList = new ArrayList(); }
  5.         public void Add(Product p) { prodList.Add(p); }
  6.         public void Del(int pToDelete) { prodList.RemoveAt(pToDelete); }
  7.         public void ClearAll(Product p) { prodList.Clear(); }
  8.         public int Count { get { return prodList.Count; } }
  9.         public bool Contains(Product p) { return prodList.Contains(p); }
  10.         public IEnumerator GetEnumerator() { return prodList.GetEnumerator(); }
  11. }
Написал обертку для ArrayList, хотел хранить список "продуктов", тип данных - Product. Т.е.,
static void Main()
{

    Products DB = new Products();
    DB.Add(new Product("Молоко", 567809, 1.0, 9.9, "23.08.14", 130, true, "\"Молокозавод\""));
}


Однако, не могу получить доступ к DB[i] ... Нашел, что есть такая вещь, как индексаторы. Но там используют массивы в качестве базы.

Вопрос: можно ли это все объединить? Или как правильно написать коллекцию, подобную ArrayList?

:ps: Так-то я бы сразу использовал AL, но в контексте задачи в список следует отдавать данные только конкретного типа, а не любой объект. В Java я бы дженерики использовал, там проще. А здесь обертка (с делегированием? :dum: )..
:ps::ps: Очень много всего интересного в С#, каша в голове :-D
Ответы
 
1 голос
 
# 13.04.2017 / 21:43  Arigato
ArrayList — создание додженериковских времён. Используй List<T>.
13.04.2017 / 22:00  Витаминыч
Т.е., и вместо массива? Как тогда конструктор будет выглядеть?

Блин, а в яве аррайлист в пакете с остальными дженериками, привык к нему. Долго думал, почему из system.collections.generics не находится аррайлист :gg:
13.04.2017 / 22:16  Arigato
Какого массива
 
0 голосов
 
# 14.04.2017 / 21:37  Витаминыч
  1. class Products : IEnumerable
  2.     {
  3.         private List<Product> prodList;
  4.  
  5.         public Products(){ prodList = new List<Product>(); }
  6.         public Product this[int index]
  7.         {
  8.             get { return prodList[index]; }
  9.             set { prodList[index] = value; }
  10.         }
  11.         public void Add(Product p) { prodList.Add(p); }
  12.         public void Del(int pToDelete) { prodList.RemoveAt(pToDelete); }
  13.         public void ClearAll(Product p) { prodList.Clear(); }
  14.         public int Count { get { return prodList.Count; } }
  15.         public bool Contains(Product p) { return prodList.Contains(p); }
  16.         public IEnumerator GetEnumerator() { return prodList.GetEnumerator(); }
  17.     }
Во, заработало :-D
Все никак не мог понять, почему именно List, когда и ArrayList неплох, а потом увидел <T> :кек2:

Была ошибка "Невозможно индексировать", нагуглил примеры, но там везде массивы фигурируют в качестве основы, и только в одном примере AL, но там им не требовалось получать объект по конкретному индексу, все перебиралось через foreach.
А мне как раз надо к любому элементу иметь доступ.
28.05.2017 / 15:13  Витаминыч
Но в контексте задачи данный класс не нужен, сделал сразу через List<Product>.

Хотя идея обертки понравилась, задал конкретные методы для доступа к полям и збс
Всего: 2

Реклама

Мы в соцсетях

tw tg yt gt