@p4p

Как найти в List несколько объектов без цикла?

Есть такой пул объектов

public List<Enemy> enemyPool = new List<Enemy>();

В нем допустим 30 объектов

public class Enemy
{
    public int Id { get; set; }
    public int ParentRoomId { get; set; }
    public GameObject GameObj { get; set; }
}


Есть цикл

foreach (Enemy enemy in enemyPool)
            {
                if (amount > 0)
                {
                    if (enemy.ParentRoomId == 0)
                    {
                        enemy.ParentRoomId = roomId;
                        enemy.GameObj.transform.position = spawnPosition.position;
                        enemy.GameObj.transform.rotation = spawnPosition.rotation;
                        enemy.GameObj.SetActive(true);
                        amount--;
                    }
                }
                
            }


Мне надо найти объекты у которых enemy.ParentRoomId == 0. Цикл foreach штрудирует весь список. Есть ли способ найти определенное количество без цикла? И не просто найти, а совершить над ними некий процесс при помощи науки.
  • Вопрос задан
  • 452 просмотра
Пригласить эксперта
Ответы на вопрос 5
@John_Nash
coder
break или goto для выхода из foreach
Ответ написан
Комментировать
@kttotto
пофиг на чем писать
Подозреваю, что Вы хотите что-то подобное
enemyPool
	.Where(e => e.ParentRoomId == 0)
	.Take(amount)
	.ToList()
	.ForEach(e => 
	{
		e.ParentRoomId = roomId;
		e.GameObj.transform.position = spawnPosition.position;
		e.GameObj.transform.rotation = spawnPosition.rotation;
		e.GameObj.SetActive(true);
	});

Если уж совсем хотите с оптимизировать, то можно так
count = 0;
for(vat i = 0; i < enemyPool.Count; i++)
{
	if(enemyPool[i].ParentRoomId  == 0)
	{
		count ++;
		if(count >= amount)
			break;
		enemyPool[i].ParentRoomId = roomId;
		enemyPool[i].GameObj.transform.position = spawnPosition.position;
		enemyPool[i].GameObj.transform.rotation = spawnPosition.rotation;
		enemyPool[i].GameObj.SetActive(true);
	}
}
Ответ написан
GavriKos
@GavriKos Куратор тега Unity
Не сильно понятно что вам нужно и главное почему.
Цикл так или иначе будет. Слово "найти" уже подразумевает перебор вариантов. Цикл может быть скрыт (Where из LINQ). Он может пройти не по всему массиву, а только до нахождения нужного количества (просто выходим из цикла когда нашли все что нужно.

Без цикла можно разве что заранее сложить нужные объекты куда то. Но по моему это не то что вам нужно...
Можно конечно отсортировать массив по parentRoomId и взять первые 3 элемента - но сортировка тоже цикл.
Ответ написан
@MaximIs
Возможно не прав, но у List есть такой метод, называется contains
Ответ написан
Griboks
@Griboks Куратор тега C#
Нельзя. В любом случае потребуется цикл. Количество итераций можно сократить, если список сортирован. Но зачем? Можно сократить длину кода. Для этого надо использовать обёртку цикла, например linq.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы