Unity 2D - получить значение из списка классов по значению переменной класса - PullRequest
0 голосов
/ 09 января 2019

Мой загрузчик Xml сохраняет данные из файла XML в список классов. Диалог - это класс с двумя свойствами: id и text, в котором сохраняется содержимое XML-файла. Я хочу получить значение «текстовой» переменной в DialogLoader.cs из списка в DialogContainer.cs по значению переменной id. Как я могу это сделать? Это, наверное, просто, но я не знаю как.

dialogs.xml

<?xml version="1.0" encoding="UTF-8"?>
<DialogCollection>
  <Dialogs>
    <Dialog id="1">
      <Text>Hello my friend</Text>
    </Dialog>
    <Dialog id="2">
      <Text>Hello my grandma</Text>
    </Dialog>
    <Dialog id="3">
      <Text>Hello my grandpa</Text>
    </Dialog>
  </Dialogs>
</DialogCollection>

DialogLoader.cs

public class DialogLoader : MonoBehaviour
{

public const string path = "dialogs";

void Start()
{
    DialogContainer dc = DialogContainer.Load(path);
//There I want to get text for example by id 1 (Hello my friend)
    foreach (Dialog item in dc.dialogs)
    {
        print(item.text);
    }
}

DialogContainer.cs

[XmlRoot("DialogCollection")]
public class DialogContainer
{

    [XmlArray("Dialogs")]
    [XmlArrayItem("Dialog")]
    public List<Dialog> dialogs = new List<Dialog>();

    public static DialogContainer Load(string path)
    {
        TextAsset _xml = Resources.Load<TextAsset>(path);

        XmlSerializer serializer = new XmlSerializer(typeof(DialogContainer));

        StringReader reader = new StringReader(_xml.text);

        DialogContainer dialogs = serializer.Deserialize(reader) as DialogContainer;


        reader.Close();

        return dialogs;
    }


}

Dialog.cs

public class Dialog
{

    [XmlAttribute("id")]
    public string id;

    [XmlElement("Text")]
    public string text;


}

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Вы можете использовать Linq для фильтрации списка диалогов и просто вернуть первый, соответствующий вашему условию.

Примерно так:

public Dialog GetSingleDialog(string id, List<Dialog> dialogs){

return dialogs.Where(x=>x.id==id).FirstOrDefault();
}

Вы можете использовать так:

DialogContainer dc = DialogContainer.Load(path);
//Get list of dialogs
var dialogs=dc.dialogs;
var theDialog=GetSingleDialog("1",dialogs);

// Получите ваш текст

Debug.Log(theDialog.Text);
0 голосов
/ 09 января 2019

Вы можете добавить словарь как

[XmlRoot("DialogCollection")]
public class DialogContainer
{
    [XmlArray("Dialogs")]
    [XmlArrayItem("Dialog")]
    public List<Dialog> dialogs = new List<Dialog>();

    public Dictionary<string, string> IdToText = new Dictionary<string, string>();

    public static DialogContainer Load(string path)
    {
        TextAsset _xml = Resources.Load<TextAsset>(path);

        XmlSerializer serializer = new XmlSerializer(typeof(DialogContainer));

        // use a better variable name since "dialogs" is also a field of it
        DialogContainer dialogContainer;

        // use "using" for disposables
        using(StringReader reader = new StringReader(_xml.text))
        {
            dialogContainer = serializer.Deserialize(reader) as DialogContainer;
        }

        // reset dictionary
        dialogContainer.IdToText.Clear();
        foreach(var entry in dialogContainer.dialogs)
        {
            dialogContainer.IdToText.Add(entry.id, entry.text);
        }

        return dialogContainer;
    }
}

Чем позже вы можете использовать, например.

aDialogContainer.idTotext["1"];

обратите внимание, что это вызовет исключение при поиске ключа, которого нет в словаре! Так что обратитесь к решению ниже.


Другой вариант - реализовать метод словаря вместо словаря для поиска правильного текста на лету, используя LINQ: FirstOrDefault :

public string IdtoText(string id)
{
    var foundDialog = dialogs.FirstOrDefault(dialog => string.Equals(dialog.id, id));

    //         here you can decide whether to        |
    //         return null or "" if no element found v 
    return foundDialog != null ? foundDialog.text : "";
}

Чем бы вы пользовались

aDialogContainer.IdTotext("1");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...