Как я могу извлечь строку из объекта, который содержит эту строку? - PullRequest
0 голосов
/ 24 октября 2019

Я создал Yaml, который выглядит следующим образом:

Directories:
    - ./Libraries:
        - DLLList.yml

    - ./Output:
        - None

Теперь я десериализовал этот yaml в список объектов:

List<object> allDirectoriesList = new List<object>();
List<string> allFileNames = new List<string>();

using (var reader = new StringReader(File.ReadAllText("./FileConfig.yml")))
{
    allDirectoriesList = deserializer.Deserialize<dynamic>(reader)["Directories"] as List<Object>;
}

foreach (var directory in allDirectoriesList)
{
    var directoryAsDictionary = (Dictionary<object, object>)directory;
    List<object> list = directoryAsDictionary.Select(kvp => kvp.Value).ToList();

    IEnumerable<string> _fileList = list.Select(i => i.ToString());

    List<string> fileList = _fileList.ToList<string>();

    for (int i = 0; i < fileList.Count(); i++)
    {
        var x = (string)list[i];
    }
}

directory является объектом типа Dictionaryгде я преобразовал его в список в этой части:

var directoryAsDictionary = (Dictionary<object, object>)directory;
List<object> list = directoryAsDictionary.Select(kvp => kvp.Value).ToList(); 

Этот list содержит 1 объект типа string, где хранится имя файла. Но я не могу получить эти строки из объектов. Если я их разыгрываю или конвертирую в ToString (), я всегда получаю "System.Collections.Generic.List`1[System.Object]", но в этом случае это должно быть "DLLList.yml"

1 Ответ

1 голос
/ 24 октября 2019

Предполагается, что вы используете YamlDotNet:

        List<object> allDirectoriesList = new List<object>();

        using (var reader = new StringReader(File.ReadAllText("./FileConfig.yml")))
        {
            allDirectoriesList = new DeserializerBuilder().Build().Deserialize<dynamic>(reader)["Directories"] as List<object>;
        }

        foreach (var directory in allDirectoriesList)
        {
            var directoryAsDictionary = (Dictionary<object, object>)directory;
            List<object> list = directoryAsDictionary.SelectMany(kvp => (List<object>)kvp.Value).ToList();

            List<string> _fileList = list.Select(Convert.ToString).ToList();

            foreach(var file in _fileList)
                Console.WriteLine($"Item: {file} found in {Convert.ToString(directoryAsDictionary.Keys.First())}");
        }

В основном вы пытались преобразовать значение словаря в строку, но это был список. Используя SelectMany, он может объединить все списки в один и использовать его. Было несколько лишних приведений, которые я также удалил. Для дальнейшего использования постарайтесь сделать ваши структуры как можно более простыми и десериализовать их в структуры / классы - так вам будет намного проще.

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