【问题标题】:Converting List into custom objects将列表转换为自定义对象
【发布时间】:2012-12-18 16:34:38
【问题描述】:

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

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);
        }

【问题讨论】:

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


    【解决方案1】:

    不要选择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);
            }
    

    【讨论】:

      【解决方案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&lt;CustomClass&gt; - 我只是为了向您展示您实际得到的结果。

      【讨论】:

        【解决方案3】:

        您可以使用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();
        

        【讨论】:

        • 有没有办法像 List = (from item in optXML.Descendants("Group") select new { id = (int)item.Attribute(" ID"), fileName = (string)item.Attribute("FileName") }).ToList();
        【解决方案4】:

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

            select new CustomClass { id = , fileName = }
        

        或者在 foreach 中使用像这样的异常类型

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

        您将获得完整的智能感知。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-02-21
          • 1970-01-01
          • 2013-06-16
          • 2020-02-06
          • 1970-01-01
          • 1970-01-01
          • 2011-05-01
          • 1970-01-01
          相关资源
          最近更新 更多