Невозможно преобразовать из 'System.Collections.Generic.List<string>' в 'System.Xml.Linq.XName'

Я получаю сообщение об ошибке компилятора: System.Collections.Generic.List и System.Xml.Linq.XName.

Я изначально получал "XAttribute", не содержащий определения "Trim" и не доступный метод расширения "Trim"... и т. Д. ' но я думаю, я понял, что мои цитаты были не в том месте.

Что я делаю неправильно?

    public static List<Phrase> LoadPhrasesFromXMLFile(string file)
    {
        try
        {
            XDocument xdocument = XDocument.Load(file);
            char[] trim = new char[3] { '\'', '"', ' ' };
            return xdocument.Descendants("Phrase").Select((Func<XElement, Phrase>)(x => new Phrase()
            {
                eventname = (string)x.Attribute("Event".Trim(trim)),
                priority = int.Parse((string)x.Attribute("Priority".Trim(trim))),
                words = x.Descendants("Word").Select((Func<XElement, Word>)(y =>
                {
                    Word word1 = new Word
                    {
                        preferred_text = (string)y.Attribute("Primaries".Trim(trim).ToLower())
                    };
                    List<string> stringList = (string)y.Attribute("Secondaries") == null || string.IsNullOrWhiteSpace((string)y.Attribute("Secondaries"))
                        ? new List<string>()

Сбой на этой линии:

                        : (List<string>)(IEnumerable<string>)(string)y.Attribute("Secondaries".Trim(trim).Replace(" ", "").ToLower().Split(',').ToList());

Код продолжение:

                    Word word2 = word1;
                    word2.Ssecondaries = stringList;
                    return word1;
                })).ToList<Word>()
            })).ToList<Phrase>();
        }

Ошибка отлова:

        catch (Exception ex)
        {
            Sup.Logger("Encountered an exception reading '" + file + "'. It was: " + ex.ToString(), false, true);
        }
        return (List<Phrase>)null;
    }

1 ответ

Добро пожаловать в Stackru!

Прежде всего, рассмотрим первый комментарий с точки зрения очистки некоторых из общего стиля. Код очень сложен для чтения, также как и вопрос с несколькими разделенными блоками кода.

Синтаксическая ошибка проблемной строки решается путем изменения ее на следующее (есть

    y.Attribute("Secondaries").Value.Trim(trim).Replace(" ", "").ToLower().Split(',').ToList())

Вам не нужно выполнять кастинг, поскольку ToList () уже сделает его списком. Это конец проблемы с компилятором.

Что касается создания более чистого кода, рассмотрите возможность создания вспомогательных функций:

    // переместить 'trim' в доступную ячейку памяти
    приватная строка SanitizeInput (ввод строки) 
    { 
        return input.Trim(trim).Replace(" ", "").ToLower();
    }

    // Наличие такой функции изменит код вашего решения со строки выше на:
    SanitizeInput(y.Attributes("Secondaries).Value).split ('') ToList ().
    // Эту строку гораздо легче прочитать, поскольку вы можете сказать, что синтаксический анализ XML происходит, очищается и затем обрабатывается.

Еще одна вещь, которую нужно учитывать, Word.Ssecondaries (похоже, у вас может быть опечатка в имени вашего параметра?) - посмотреть, можно ли установить это свойство в IEnumerable. Было бы опасно хранить его в виде списка, поскольку любой код может изменить Word.Secondaries. Если вы не собираетесь менять его, IEnumerable будет намного безопаснее. Если вы обнаружите, что IEnumerable удовлетворяет вашим потребностям, вы можете удалить.ToList () в вашей проблемной строке и избежать необходимости выделять новый кусок памяти для вашего списка, а также иметь более быстрый код с лениво оцененными запросами из LINQ.

Другие вопросы по тегам