Удаление элемента из списка при условии C#

350
29 апреля 2017, 20:11

У меня есть некий список, в котором находятся обьекты. К примеру есть тигр, рыба,..., Условие должно выглядеть так ( Если в списке есть тигр || рыба , то одна из рыб удаляется) Буду очень благодарен, если поможете

Answer 1

Если есть только тигр, то удалять всё равно нечего. Значит просто ищем первую рыбу и удаляем. Например, через RemoveAll, а внутри предиката уже проверяем. Ну или ищем индекс, а потом по нему удаляем.

Answer 2

Лично я за явный код и минимум экономии на строках.

public interface ICreature
{
    long Age
    {
        get;
        set;
    }
}
public class STiger : ICreature
{
    public long? DiedOnCycle;
    long ICreature.Age
    {
        get;
        set;
    }
}
public class SFish : ICreature
{
    public long? EatenOnCycle;
    long ICreature.Age
    {
        get;
        set;
    }
}
public class SCycleResult
{
    public List<STiger> StarvedTigers;
    public List<SFish> EatenFish;
    public SCycleResult()
    {
        this.StarvedTigers = new List<STiger>();
        this.EatenFish = new List<SFish>();
    }
}
public class CContainer
{
    private int cycle;
    private List<ICreature> content;
    //Исполнение цикла.
    public static SCycleResult CycleExecute(CContainer iContainer)
    {
        SCycleResult result = new SCycleResult();
        int creatureIndex = 0;
        List<Tuple<STiger, int>> hungryTigers = new List<Tuple<STiger, int>>();
        List<Tuple<SFish, int>> availableFish = new List<Tuple<SFish, int>>();
        int newCycleIndex = iContainer.cycle + 1;
        List<int> casualties = new List<int>();
        //Пробежаться по заповеднику.
        while (creatureIndex < iContainer.content.Count)
        {
            ICreature nextCreature = iContainer.content[creatureIndex];
            nextCreature.Age++;
            //Киска или рыбка?
            if (nextCreature is STiger)
            {
                STiger tiger = nextCreature as STiger;
                //Есть ли что покушать?
                if (availableFish.Count > 0)
                {
                    Tuple<SFish, int> food = availableFish[0];
                    availableFish.RemoveAt(0);
                    food.Item1.EatenOnCycle = newCycleIndex;
                    casualties.Add(food.Item2);
                    result.EatenFish.Add(food.Item1);
                }
                else
                {
                    hungryTigers.Add(new Tuple<STiger, int>(tiger, creatureIndex));
                }
            }
            else if (nextCreature is SFish)
            {
                SFish fish = nextCreature as SFish;
                //Есть ли кому скормить?
                if (hungryTigers.Count > 0)
                {
                    Tuple<STiger, int> eater = hungryTigers[0];
                    hungryTigers.RemoveAt(0);
                    fish.EatenOnCycle = newCycleIndex;
                }
                else
                {
                    availableFish.Add(new Tuple<SFish, int>(fish, creatureIndex));
                }
            }
            else
            {
                //Неопознанный живой объект.
                Exception clsUnknownCreature = new ApplicationException("Обнаружено неизвестное существо.");
                clsUnknownCreature.Data.Add("creatureIndex", creatureIndex);
                clsUnknownCreature.Data.Add("nextCreature", nextCreature);
                clsUnknownCreature.Data.Add("iContainer", iContainer);
                throw clsUnknownCreature;
            }
            creatureIndex++;
        }
        //Были голодные - стали холодные.
        foreach (Tuple<STiger, int> doomedTiger in hungryTigers)
        {
            doomedTiger.Item1.DiedOnCycle = newCycleIndex;
            result.StarvedTigers.Add(doomedTiger.Item1);
            casualties.Add(doomedTiger.Item2);
        }
        //Чистим по индексу, так что надо аккуратно.
        casualties.Sort();
        //Убрать ошмётки рыбы и/или истощенные трупы.
        for (int casualtyIndex = casualties.Count - 1; casualtyIndex >= 0; casualtyIndex--)
        {
            iContainer.content.RemoveAt(casualties[casualtyIndex]);
        }
        iContainer.cycle++;
        return result;
    }
}

Не тестил, это уж вы сами.

READ ALSO
Как перейти на сайт без URL?

Как перейти на сайт без URL?

Как сделать так, чтобы драйвер перешёл на другой сайт вместе с нажатием по элементу? Просто URL ка каждом аккаунте разныйПример:

316
Какой метод в WPF срабатывает при смене UserControl в ContentControl?

Какой метод в WPF срабатывает при смене UserControl в ContentControl?

В приложении по клику на разные кнопки меню в ContentControl подгружаются разные вьюшкиВ каждой вьюьшке идет запрос к базе данных, каждую секунду...

435
Как сделать sprite во весь экран?

Как сделать sprite во весь экран?

Как сделать sprite во весь экран (Независимую размерность, унив?

316
Синхронизация процессов - RR строгое чередование для 2 процессов

Синхронизация процессов - RR строгое чередование для 2 процессов

Помогите написать на любом языке программу, которая

514