Только вот использовать LINQ нужно с осторожностью. Лично я бы вообще не использовал его в том же Update или любом другом месте, где часто вызывается код.
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
[System.Serializable]
public class TestEvent
{
[SerializeField] private int _b;
public int B => _b;
}
public class TestScript : MonoBehaviour
{
[SerializeField] private List<TestEvent> _testEvents;
private int a = 3;
void Start()
{
var events = _testEvents
.Where(item => item.B == a)
.ToArray();
}
}
Тоже самое, но без LINQ. Чисто показать принцип, так как это элементарная задача, а ты этого не сделал, значит нужно учиться. Если кол-во элементов в List _testEvents небольшое всегда, я бы ещё создавал var results = new List(); с указанием capacity равному _testEvents.Count. То есть так var results = new List(_testEvents.Count);
public class TestScript : MonoBehaviour
{
[SerializeField] private List<TestEvent> _testEvents;
private int a = 3;
void Start()
{
var events = GetEvents(_testEvents, item => item.B == a);
}
private static List<TestEvent> GetEvents(
IEnumerable<TestEvent> testEvents, Func<TestEvent, bool> predicate)
{
var results = new List<TestEvent>();
foreach (var item in testEvents)
{
if (predicate(item))
{
results.Add(item);
}
}
return results;
}
}
Продублирую решение из комментариев:
public class TestScript : MonoBehaviour
{
[SerializeField] private List<TestEvent> _testEvents;
private int a = 3;
void Start()
{
var element = GetFirstOrDefault(_testEvents, item => item.B == a);
if (element is not null)
{
c = element.c;
r = element.r;
u = element.u;
}
}
// Если совпадение не найдено, то вернуть значение по умолчанию.
private static T GetFirstOrDefault<T>(IEnumerable<T> items, Func<T, bool> predicate)
{
foreach (var item in items)
{
if (predicate(item))
{
return item;
}
}
return default;
}
}