Невозможно преобразовать из '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.