我如何检查 2 个列表是否在 C# 中具有相同的精灵
How do i check if 2 Lists have the same Sprites in c#
问题是,我如何比较两个相同类型的列表(在本例中为 Sprite)并检查它们是否相等。
为了进入我的代码,我有 GameObjects 符号、阴影和电缆,它们通过单击按钮(不同的脚本)来更改它们的精灵。另一方面,我有 GameObject[] 并且我已经插入了 GameObjects。现在我制作了一个以 GameObject 作为键并以特定的 Sprites 列表作为值的字典,我在 List ActualList 中搜索一个键和 return 值并将其与由 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);
}
}
SequenceEqual 中使用的默认比较器将检查 CompareList 中 class Sprite 实例的引用指针是否与存储在 ActualList 中的 "memory reference pointer" 相同。如果没有看到它的完整生命周期,我们无法确定,但如果 GetComponent() 创建了 class Sprite 的新实例,您的代码将无法按预期工作。如果我记得 Unity,它很可能会创建一个新实例或 return 一个缓存实例。
我希望您需要在列表之间比较一些 属性(如 AssetID 或精灵的其他唯一值),而不是列表引用指针本身;特别是如果您不能完全控制应用程序中的 Sprite class 生命历史并且您正在使用其他人的工厂(即 GetComponent)
问题是,我如何比较两个相同类型的列表(在本例中为 Sprite)并检查它们是否相等。 为了进入我的代码,我有 GameObjects 符号、阴影和电缆,它们通过单击按钮(不同的脚本)来更改它们的精灵。另一方面,我有 GameObject[] 并且我已经插入了 GameObjects。现在我制作了一个以 GameObject 作为键并以特定的 Sprites 列表作为值的字典,我在 List ActualList 中搜索一个键和 return 值并将其与由 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);
}
}
SequenceEqual 中使用的默认比较器将检查 CompareList 中 class Sprite 实例的引用指针是否与存储在 ActualList 中的 "memory reference pointer" 相同。如果没有看到它的完整生命周期,我们无法确定,但如果 GetComponent() 创建了 class Sprite 的新实例,您的代码将无法按预期工作。如果我记得 Unity,它很可能会创建一个新实例或 return 一个缓存实例。
我希望您需要在列表之间比较一些 属性(如 AssetID 或精灵的其他唯一值),而不是列表引用指针本身;特别是如果您不能完全控制应用程序中的 Sprite class 生命历史并且您正在使用其他人的工厂(即 GetComponent)