У меня есть некий список, в котором находятся обьекты. К примеру есть тигр, рыба,..., Условие должно выглядеть так ( Если в списке есть тигр || рыба , то одна из рыб удаляется) Буду очень благодарен, если поможете
Если есть только тигр, то удалять всё равно нечего. Значит просто ищем первую рыбу и удаляем. Например, через RemoveAll
, а внутри предиката уже проверяем. Ну или ищем индекс, а потом по нему удаляем.
Лично я за явный код и минимум экономии на строках.
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;
}
}
Не тестил, это уж вы сами.
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Виртуальный выделенный сервер (VDS) становится отличным выбором
Как сделать так, чтобы драйвер перешёл на другой сайт вместе с нажатием по элементу? Просто URL ка каждом аккаунте разныйПример:
В приложении по клику на разные кнопки меню в ContentControl подгружаются разные вьюшкиВ каждой вьюьшке идет запрос к базе данных, каждую секунду...
Как сделать sprite во весь экран (Независимую размерность, унив?
Помогите написать на любом языке программу, которая