-1

我收到编译器错误:“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;
    }
4

1 回答 1

0

欢迎来到 StackOverflow!

首先,考虑一下关于清理一些一般风格的第一条评论。该代码非常难以阅读,并且问题具有多个拆分代码块。

有问题的行的语法错误通过将其更改为以下来解决(有

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

您无需进行任何转换,因为 ToList() 已经将其设为列表。这就是确切的编译器问题的结束。

在如何制作更简洁的代码方面,请考虑制作辅助函数:

    // 将 'trim' 移动到可访问的内存位置
    私有字符串 SanitizeInput(字符串输入)
    {
        return input.Trim(trim).Replace("", "").ToLower();
    }

    // 拥有这样的函数会将您的解决方案代码从上面的行更改为:
    SanitizeInput(y.Attributes("Secondary).Value).Split(',').ToList();
    // 这一行更容易阅读,因为您可以看出 XML 解析正在发生、被清理和操作。

要考虑的另一件事是 Word.Ssecondaries(看起来您的参数名称中可能有错字?)是查看该属性是否可以设置为 IEnumerable。由于任何代码都可能更改 Word.Secondaries,因此将其存储为列表是很危险的。如果您不打算更改它,IEnumerable 会更安全。如果您发现 IEnumerable 满足您的需求,您可以删除有问题的行中的 .ToList() 并避免为您的列表分配新的内存块,以及使用来自 LINQ 的延迟评估查询获得更快的代码

于 2019-01-06T05:04:27.500 回答