Как проверить, имеют ли 2 списка одинаковые спрайты в C#

Вопрос в том, как сравнить два списка одного типа (в данном случае Sprite) и проверить, равны ли они. Чтобы попасть в мой код, у меня есть символ GameObjects, тень и кабель, и они меняют свой спрайт нажатием кнопки (другой скрипт). С другой стороны, у меня есть GameObject[], и у меня уже есть GameObjects. Теперь я создаю словарь с GameObject в качестве ключа и определенным списком спрайтов в качестве значения, я ищу ключ и возвращаю значение в список ActualList и сравниваю его со списком, состоящим из текущих спрайтов символа GameObjects, тени, кабеля. Моя проблема в том, что он не применяет RigidBody к GameObject, поэтому оператор if, похоже, не работает. Может быть, есть другой способ сравнить два списка.

using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.UI;
public class Rigi : MonoBehaviour
{
    public GameObject[] Akkus;
    public Button Generator;
    public GameObject symbol, shadow, cable;
    int count1;
    public Sprite[] spriteSymbols, spriteShadows, spriteCables;
    public Dictionary<GameObject, List<Sprite>> AkkuDic = new 
Dictionary<GameObject, List<Sprite>>();
    public List<Sprite> ActualList = new List<Sprite>();
    public void On_Click_Button1()
    {

        List<Sprite> CompareList = new List<Sprite>();
        CompareList.Add(symbol.GetComponent<SpriteRenderer>().sprite);
        CompareList.Add(shadow.GetComponent<SpriteRenderer>().sprite);
        CompareList.Add(cable.GetComponent<SpriteRenderer>().sprite);

        AkkuDic.TryGetValue(Akkus[count1], out ActualList);

        if(ActualList.SequenceEqual(CompareList))
        {
            Rigidbody RigidbodyGameobject = 
Akkus[count1].AddComponent<Rigidbody>();

        }
    }

    public void Awake()
    {
        List<Sprite> mySpritesWind = new List<Sprite>();
        mySpritesWind.Add(spriteSymbols[5]);
        mySpritesWind.Add(spriteShadows[0]);
        mySpritesWind.Add(spriteCables[0]);
        List<Sprite> mySpritesOel = new List<Sprite>();
        mySpritesOel.Add(spriteSymbols[4]);
        mySpritesOel.Add(spriteShadows[2]);
        mySpritesOel.Add(spriteCables[1]);
        List<Sprite> mySpritesWasser = new List<Sprite>();
        mySpritesWind.Add(spriteSymbols[5]);
        mySpritesWind.Add(spriteShadows[0]);
        mySpritesWind.Add(spriteCables[0]);
        List<Sprite> mySpritesSolar = new List<Sprite>();
        mySpritesWind.Add(spriteSymbols[3]);
        mySpritesWind.Add(spriteShadows[5]);
        mySpritesWind.Add(spriteCables[0]);
        List<Sprite> mySpritesKern = new List<Sprite>();
        mySpritesWind.Add(spriteSymbols[1]);
        mySpritesWind.Add(spriteShadows[1]);
        mySpritesWind.Add(spriteCables[1]);
        List<Sprite> mySpritesKohle = new List<Sprite>();
        mySpritesWind.Add(spriteSymbols[2]);
        mySpritesWind.Add(spriteShadows[4]);
        mySpritesWind.Add(spriteCables[1]);

        AkkuDic.Add(Akkus[0], mySpritesWind);
        AkkuDic.Add(Akkus[1], mySpritesOel);
        AkkuDic.Add(Akkus[2], mySpritesWasser);
        AkkuDic.Add(Akkus[3], mySpritesSolar);
        AkkuDic.Add(Akkus[4], mySpritesKern);
        AkkuDic.Add(Akkus[5], mySpritesKohle);

    }
}

1 ответ

Решение

Компаратор по умолчанию, используемый в SequenceEqual, проверит, является ли указатель ссылки экземпляра класса Sprite в CompareList тем же "указателем ссылки памяти", который хранится в ActualList. Не видя полного жизненного цикла этого, мы не можем быть уверены, но если GetComponent() когда-либо создаст новый экземпляр класса Sprite, ваш код не будет работать должным образом. Если я помню Unity, он вполне может создать новый экземпляр или вернуть кэшированный экземпляр.

Я ожидаю, что вам нужно сравнить какое-либо свойство (например, AssetID или другое уникальное значение спрайта) между списками, а не сами указатели на список ссылок; особенно если у вас нет полного контроля над историей жизни класса Sprite в приложении, и вы используете чью-то другую фабрику (например, GetComponent)

Другие вопросы по тегам