无法从“ System.Collections.Generic.List <字符串>”转换为“ System.Xml.Linq.XName”

时间:2019-01-05 21:22:31

标签: c# string 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 个答案:

答案 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的延迟评估查询获得更快的代码