Цикл foreach при работе с коллекциями и массивами - C#

Узнай цену своей работы

Формулировка задачи:

Всем привет. Начал ищучение коллекцийи цикла foreach приминяемого для работы с ними. Имеется банальный, так сказать тренировачный пример: Модуль element.cs
Листинг программы
  1. // Экземпляры этого класса будет содержать коллекция - UserCollection.
  2. public class Element
  3. {
  4. // Поля.
  5. private string name;
  6. private int field1;
  7. private int field2;
  8. // Конструктор.
  9. public Element(string s, int a, int b)
  10. {
  11. name = s;
  12. field1 = a;
  13. field2 = b;
  14. }
  15. // Свойства.
  16. public int Field1
  17. {
  18. get { return field1; }
  19. set { field1 = value; }
  20. }
  21. public int Field2
  22. {
  23. get { return field2; }
  24. set { field2 = value; }
  25. }
  26. public string Name
  27. {
  28. get { return name; }
  29. set { name = value; }
  30. }
  31. }
модуль UserCollections.cs
Листинг программы
  1. // Класс UserCollection коллекция (набор) объектов класса Element.
  2. // Для применения foreach, необходимо, чтобы класс реализовывал интерфейс - IEnumerable.
  3. public class UserCollection : IEnumerable, IEnumerator
  4. {
  5. public Element[] elementsArray = null;
  6. public UserCollection()
  7. {
  8. elementsArray = new Element[4];
  9. elementsArray[0] = new Element("A", 1, 10);
  10. elementsArray[1] = new Element("B", 2, 20);
  11. elementsArray[2] = new Element("C", 3, 30);
  12. elementsArray[3] = new Element("D", 4, 40);
  13. }
  14. // Указатель текущей позиции элемента в массиве.
  15. int position = -1;
  16. // ------------------------------------------------------------------------------------------------------------------
  17. // Реализация интерфейса IEnumerator.
  18. // Передвинуть внутренний указатель (position) на одну позицию.
  19. public bool MoveNext()
  20. {
  21. if (position < elementsArray.Length - 1)
  22. {
  23. position++;
  24. return true;
  25. }
  26. else
  27. {
  28. return false;
  29. }
  30. }
  31. // Установить указатель (position) перед началом набора.
  32. public void Reset()
  33. {
  34. position = -1;
  35. }
  36. // Получить текущий элемент набора.
  37. public object Current
  38. {
  39. get { return elementsArray[position]; }
  40. }
  41. // -----------------------------------------------------------------------------------------------------------------
  42. // Реализация интерфейса - IEnumerable.
  43. IEnumerator IEnumerable.GetEnumerator()
  44. {
  45. return this as IEnumerator;
  46. }
  47. }
Модуль Program.cs
Листинг программы
  1. UserCollection myCollection = new UserCollection();
  2. // Используем foreach, для обращения к каждому объекту Element внутри массива myCollection.
  3. foreach (Element element in myCollection)
  4. {
  5. Console.WriteLine("Name: {0} Field1: {1} Field2: {2}", element.Name, element.Field1, element.Field2);
  6. }
  7. //myCollection.Reset(); // Убрать комментарий для проверки.
  8. Console.Write(new string('-', 29) + "\n");
  9. // Используем foreach, для повторного обращения к каждому объекту Element внутри массива myCollection.
  10. foreach (Element element in myCollection)
  11. {
  12. Console.WriteLine("Name: {0} Field1: {1} Field2: {2}", element.Name, element.Field1, element.Field2);
  13. }
  14. Console.Write(new string('-', 29) + "\n");
при работе которго, на экран выводится следующие: см. рисунок 1 Если же мы снимаем комментарий со строки(см рисунок 2)
Листинг программы
  1. myCollection.Reset();
- которая сбрасывает указатель position до -1 т.е ха пределлы нашей коллекции, что и дает возможность выванному после этого еще одному циклу foreach заново пробежатся по нашей коллекции и извлекая ее элементы, а затем при кажой итерации помещая каждый элемент в переменную итерации - выводить на экран значение извлеченного элемента коллекции. А когда вышеописаннная строка была закоментированна, то после первого цикла foreach, второй не срабатывал - т.к указатель position уже и так был в конце нашей коллекции. После этого автор видеокурса, который я смотрю предлагает рассмотреть работу цикла foreach вместе с массивом а не с коллекциями.
Листинг программы
  1. int [] array={1,2,3,4,5,6,7,8,9,10}
  2. foreach(int titem in array)
  3. {
  4. Console.Writeline(item);
  5. }
Затем копирует данный цикл foreach , и не вставляя между ними Reset(); - используя два цикла foreach "подряд" без промежутка в виде Reset(); Самое интрестное, что автор говорит, цитирую - "На самом деле, все массывы в C# - являются настоящими коллекциями. В C# не существует массивов - это всего лишь иллюзия и удобный синтаксис." Аргументируя это вот чем:
Листинг программы
  1. public abstract class Array : ICloneable, IList, ICollection, IEnumerable, IStructuralComparable, IStructuralEquatable
- что класс Array реалезует интерфейс IEnumerable - здесь же на форуме я уже спрашивал об этом интерфейсе Содержимое интерфейса IEnumerable. Но вот в чем мой вопрос:Почему в "обычных" коллекциях - т.е которые мы создаем сами нужно сбрасывать position для повторного проходп ро коллекции с помощью цикла foreach еще раз, а в обычном массиве, который по славам автора также является коллекцие - мы не производим этого действия? (правда в строение класса Array я не углублялся и не знаю, присутствует ли в нем вообще некий указатель? Может хоть и класс Array и реалезует интерфейс IEnumerable в нем (в классе) может не существовать подобного механизма - я не знаю)

Решение задачи: «Цикл foreach при работе с коллекциями и массивами»

textual
Листинг программы
  1. while(MoveNext){
  2. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы