无法隐式转换类型system.collections.generic

时间:2014-10-01 05:35:30

标签: c# .net linq

我收到以下错误:

  

无法隐式转换类型'System.Collections.Generic.List>'到'System.Collections.Generic.List

我的代码是:

class Check
{
      public string Text { get; set; }

      public  List<Check> getxml()
      {
          XDocument xdoc = XDocument.Load(@"D:\Web Utf-8 Converter\Categories.xml");

          var list = (from p in xdoc.Descendants("Categories")
                      select p.Elements("name"));

          var listing = list.ToList();

          return listing;
      }
}

在我看来,这似乎是转换错误。但我不知道如何转换。请帮助。

谢谢。

3 个答案:

答案 0 :(得分:2)

根据你的编辑,它应该是这样的:

return xdoc
    .Descendants("Categories")
    .SelectMany(_ => _.Elements("name"))
    .Select(_ => new Check(_.Value))
    .ToList();

注意,getxml不应该是Check类的实例方法。它应该至少是静态工厂方法。

答案 1 :(得分:1)

select语句返回System.Xml.Linq.XElement。您的方法的返回类型是List。这些都不一样。

你能做的是:

 var list = (from p in xdoc.Descendants("Categories")
     select new Check { Text = p.Elements("name").Value});

但是我觉得你的班级Check不应该读取xml并存储每个元素的结果。

你应该有一个“XmlParser”类,它有GetXml方法和一个保存信息的类“XmlValue”。即。

public class XmlValue
{
    public System.Xml.Linq.XElement Element { get; set; }
    public string Text
    {
        get
        {
            if(Element == null) return null;
            return Element.Value;
        }
    }
}

public class XmlParser
{
    public List<XmlValue> GetXml()
    {
        XDocument xdoc = XDocument.Load(@"D:\Web Utf-8 Converter\Categories.xml");

        return xdoc
            .Descendants("Categories")
            .SelectMany(p => p.Elements("name"))
            .Select(p => new XmlValue { Element = p });
            .ToList();
    }
}

void Main()
{
    XmlParser parser = new XmlParser();
    var list = parser.GetXml();
    foreach(var el in list)
        Console.WriteLine(el.Text);
}

答案 2 :(得分:0)

您将返回来自

的列表
var list = (from p in xdoc.Descendants("Categories")
                  select p.Elements("name"));

但返回类型是List。 'System.Xml.Linq.XElement'不是'Check',你必须以某种方式提供转换。也许写一个构造函数给Check-class接受System.Xml.Linq.XElement,然后代替返回列表,你可以

return listing.Select(x => new Check(x)).ToList();