Audes
@Audes

Уничтожить объект в foreach?

Сразу говорю, что вопрос чисто для теоретических познаний) Если я прохожусь циклом foreach по некому массиву, то как уничтожить объект из массива, если имеется только его копия, а не ссылка.
  • Вопрос задан
  • 171 просмотр
Решения вопроса 1
Casper-SC
@Casper-SC
Программист (.NET)
Никак, если эта копия никак не ссылается на исходный объект и если ты не инкрементируешь какую-то переменную типа int, чтобы с её помощью обратиться к исходному массиву по этому индексу и удалить там объект тоже. Но тогда зачем использовать foreach.

Вот о чём я.
public class Person
    {
        public string Name { get; set; }

        public int Age { get; set; }
    }


class Program
    {
        static void Main(string[] args)
        {
            var source = new Person[]
                {
                    new Person { Age = 20, Name = "Сергей" },
                    new Person { Age = 32, Name = "Дмитрий" },
                    new Person { Age = 18, Name = "Андрей" }
                };

            var copy = new Person[source.Length];
            Array.Copy(source, copy, source.Length);

            DisplayPersons(copy);
            Console.WriteLine();

            int index = 0;
            foreach (Person person in copy)
            {
                Console.WriteLine(person.Name + " удалён из исходного массива");
                source[index++] = null;
            }

            if (source.Any(p => p != null))
            {
                Console.WriteLine("Не удалось удалить все элементы исходного массива.");
            }

            Console.ReadKey();
        }

        static void DisplayPersons(IEnumerable<Person> persons)
        {
            foreach (Person person in persons)
            {
                Console.WriteLine("Имя: {0}, возраст: {1}", person.Name, person.Age);
            }
        }
    }
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Nipheris
@Nipheris Куратор тега C#
Если я прохожусь циклом foreach

Не стОит удалять что-либо из коллекции, по который вы В ДАННЫЙ МОМЕНТ проходитесь foreach. Чревато исключениями по причине умерших енумераторов.

как уничтожить объект из массива, если имеется только его копия

Взять обычный for, определить критерии сравнения двух объектов (чтобы собственно выяснить, какой объект является "копией" - по ссылке не сравнишь, т.к. это уже другой самостоятельный объект) - по каким-либо свойствам или еще как-то, найти этот объект и удалить его смещением остальных элементов массива на его место. Если бы у вас был список, достаточно было бы RemoveAt.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы