YugGO
@YugGO

Как мне это реализовать в List?

В моём проекте есть: (Это тестовый код)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[System.Serializable]
public class TestEvent
{
    public int b;
}

public class TestScript : MonoBehaviour
{
    public List<TestEvent> testEvents;

    private int a = 3;

    private void Start()
    {
        
    }
}


В "Start()" мне нужно чтобы в List искали значение b равное значению а.
А если не находит, то ничего не происходит.

Inspector:
6134bd0a048a8484532925.jpeg

Может кто-то знает способ, или статью\мануал который мне поможет.
Если что-то не понятно, напишите, я сразу отвечу.
Спасибо.
  • Вопрос задан
  • 143 просмотра
Решения вопроса 1
Casper-SC
@Casper-SC
Программист (.NET)
Только вот использовать 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;
    }
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
zagayevskiy
@zagayevskiy
Android developer at Yandex
Комментировать
Ваш ответ на вопрос

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

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