我遇到编译器错误:“ 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;
}
答案 0 :(得分:0)
欢迎使用StackOverflow!
首先,考虑整理一些常规样式的第一个评论。该代码很难阅读,而且问题有多个拆分代码块。
将有问题的行的语法错误更改为以下内容即可解决(存在
y.Attribute("Secondaries").Value.Trim(trim).Replace(" ", "").ToLower().Split(',').ToList())
您不需要执行任何强制转换,因为ToList()已将其列为列表。 到此为止,确切的编译器问题就结束了。
关于如何编写更简洁的代码,请考虑编写辅助函数:
// move 'trim' into an accessible memory location private string SanitizeInput (string input) { return input.Trim(trim).Replace(" ", "").ToLower(); } // Having a function like this will change your solution code from the line above to: SanitizeInput(y.Attributes("Secondaries).Value).Split(',').ToList(); // This line is much easier to read as you can tell that the XML parsing is happening, being cleaned, and then manipulated.
要考虑的另一件事,Word.Ssecondaries(看起来您的参数名称中可能有错字?)是查看该属性是否可以设置为IEnumerable。将其存储为列表是很危险的,因为任何代码都可能更改Word.Secondaries。如果您不打算更改它,则IEnumerable会更安全。 如果您发现IEnumerable满足您的需求,则可以在问题行中删除.ToList(),避免为列表分配新的内存块,以及使用来自LINQ的延迟评估查询获得更快的代码