将List转换为自定义对象

时间:2012-12-18 16:34:38

标签: c# .net linq linq-to-xml

我正在使用XDocument库读取XML文档,并使用C#中的LINQ查询列表。我将一个无意义的列表返回到隐式变量中。任何类型都是一种简单的结构。我不确定我做错了什么但是想将它返回到我已定义的类的列表中但是在将此匿名类型转换为我的自定义类时出错。我错过了一些明显的东西吗?我不想在这里使用动态类型。

public class CustomClass
    {
        public string id { get; set; }
        public int fileName { get; set; }
    }

XDocument optXML = XDocument.Load(pathName);

var optInput = (from item in optXML.Descendants("Group")
                    select new
                    {
                        id = (int)item.Attribute("ID"),
                        fileName = (string)item.Attribute("FileName")
                    }).ToList();
foreach (CustomClass item in optInput)
        {
            Console.WriteLine(item.id);
        }

4 个答案:

答案 0 :(得分:4)

而不是选择new{}选择new CustomClass()

public class CustomClass
    {
        public string id { get; set; }
        public int fileName { get; set; }
    }

XDocument optXML = XDocument.Load(pathName);

var optInput = (from item in optXML.Descendants("Group")
                    select new CustomClass()
                    {
                        id = (int)item.Attribute("ID"),
                        fileName = (string)item.Attribute("FileName")
                    }).ToList();
foreach (CustomClass item in optInput)
        {
            Console.WriteLine(item.id);
        }

答案 1 :(得分:2)

我认为你想投射到CustomClass而不是匿名对象

List<CustomClass> optInput = (from item in optXML.Descendants("Group")
                select new CustomClass 
                {
                    id = (int)item.Attribute("ID"),
                    fileName = (string)item.Attribute("FileName")
                }).ToList();

没有具体的理由将代码中的var更改为List<CustomClass> - 我刚刚完成了向您展示您实际获得的内容。

答案 2 :(得分:1)

您可以使用var代替自定义类型,它将是您的投影中编译器使用new生成的类型。

foreach (var item in optInput)
{
     Console.WriteLine(item.id);
}

或者您可以创建班级的对象,即CustomClass,而不是使用匿名类型。

  var optInput = (from item in optXML.Descendants("Group")
                select new CustomClass 
                {
                    id = (int)item.Attribute("ID"),
                    fileName = (string)item.Attribute("FileName")
                }).ToList();

答案 3 :(得分:1)

您收到此错误,因为您在查询中选择的匿名类型不是CustomClass。你可以简单地选择Customclass本身

    select new CustomClass { id = , fileName = }

或在foreach

中使用类似的anomymous类型
    foreach (var item in optInput) 
    { 
        Console.WriteLine(item.id); 
    }       

你将获得完整的intellisense。