Предполагая, что ваши списки находятся в правильном порядке и имеют точно такой же размер, как вы могли бы
public Dictionary<string, GameObject> ImageByString = new Dictionary<string, GameObject>();
public Dictionary<GameObject, string> StringByImage = new Dictionary<GameObject, string>();
private void Start()
{
// at least have an "emergency" check and use the smaller list count
var count = Mathf.Min(vp.Count, word.Count);
for(var i = 0; i < count; i++)
{
ImageByString.Add(word[i], vp[i]);
StringByImage.Add(vp[i], word[i]);
}
}
или используя Linq
using System.Linq;
...
private void Start()
{
ImageByString = word.Zip(vp, (k, v) => new {k, v}).ToDictionary(x => x.k, x => x.v);
StringByImage = vp.Zip(word, (k, v) => new {k, v}).ToDictionary(x => x.k, x => x.v);
}
Однако это не будет отображаться в Unity Inspector. Если вы пытаетесь достичь этого, вам лучше реализовать собственный класс, такой как
[Serializable]
public class WordImagePair
{
public string word;
public GameObject vp;
}
Тогда вы должны «поверить», что все значения word
уникальны, поэтому вы можете просто сделать
public List<WordImagePair> pairs = new List<WordImagePair>();
Теперь либо используйте словарь снова, как
public Dictionary<string, GameObject> ImageByString = new Dictionary<string, GameObject>();
public Dictionary<GameObject, string> StringByImage = new Dictionary<GameObject, string>();
private void Start()
{
foreach(var pair in pairs)
{
ImageByString.Add(pair.word, pair.vp);
StringByImage.Add(pair.vp, pair.word);
}
}
или снова с Linq
private void Start()
{
ImageByString = pairs.ToDictionary(p => p.word, p => p.vp);
StringByImage = pairs.ToDictionary(p => p.vp, P => p.word);
}
или позже используйте Linq напрямую для доступа к таким изображениям, как
public GameObject ImageByString(string word)
{
var output = pairs.FirstOrDefault(p => string.Equals(p.word, word));
if(output == null)
{
Debug.LogErrorFormat(this, "No Image with word=\"{0}\" found!", word);
}
return output;
}
public string StringByImage(GameObject vp)
{
var output = pairs.FirstOrDefault(p => p.vp == vp);
if(output == null)
{
Debug.LogErrorFormat(this, "No word for given GameObject {0} found!", vp.name);
}
return output;
}
Примечание: напечатано на смартфоне, поэтому никаких гарантий, но я надеюсь, что идея проясняется.