如何在c#

时间:2017-05-29 16:17:21

标签: c# unity2d

问题是,如何比较两个相同类型的列表(在本例中为Sprite)并检查它们是否相等。 为了进入我的代码,我有GameObjects符号,阴影和电缆,然后用buttonclick(不同的脚本)更改他们的精灵。另一方面,我有GameObject [],我已经插入了GameObjects。现在我创建一个以GameObject为关键字和一个特定的精灵列表作为值的字典,我搜索一个键并将值返回到List ActualList,并将其与由GameObjects符号,阴影,电缆的当前精灵组成的List进行比较。 我的问题是它没有将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 个答案:

答案 0 :(得分:0)

SequenceEqual中使用的默认比较器将检查CompareList中Sprite的类实例的引用指针是否与存储在ActualList中的“内存引用指针”相同。在没有看到完整生命周期的情况下我们无法确定,但如果GetComponent()创建了Sprite类的新实例,则代码将无法按预期工作。如果我记得Unity,它可能会创建一个新实例或返回一个缓存的实例。

我希望你需要在列表之间比较一些属性(比如AssetID或精灵的其他唯一值),没有列表引用指针本身;特别是如果你没有完全控制应用程序中的Sprite类生活历史,并且你正在使用别人工厂(即GetComponent)