【问题标题】:Implementing IEnumerable in C# 4.0在 C# 4.0 中实现 IEnumerable
【发布时间】:2011-11-09 14:47:56
【问题描述】:

我有这门课:

public class Detail
{
    public Detail() { }
    public Detail(Guid Id, DateTime InstanceDate, string Name)
    {
        CId = Id;
        StateInstanceDate = InstanceDate;
        StateName = Name;
    }

    public Guid CId { get; set; }
    public DateTime StateInstanceDate { get; set; }
    public string StateName { get; set; }
}

这就是我尝试使用 LINQ 访问数据的方式:

public List<Detail> Getinfo()
{
    CaseContext cs = new CaseContext();
    var query = (from p in cs.table1    
                join q in cs.table2  
                 on p.StateKey equals q.StateKey 
                 select new Detail
                 {
                     p.CId,
                     p.InstanceDate,
                     q.StateName
                 }).ToList<Detail>();

    cs.Dispose();
    return query;
}

但是我收到了这个错误,

无法使用集合初始化程序初始化类型“Detail”,因为它没有实现“System.Collections.IEnumerable”

有什么帮助吗?

【问题讨论】:

    标签: c# .net .net-4.0 ienumerable linq-to-objects


    【解决方案1】:

    您必须正确分配属性或使用构造函数:

    select new Detail( p.CId, p.InstanceDate, q.StateName)
    

    或者

    select new Detail 
    {
      CId = p.CId, 
      StateInstanceDate = p.InstanceDate, 
      StateName = q.StateName 
    }
    

    【讨论】:

      【解决方案2】:

      更改您的初始化程序,您当前使用的语法是针对集合初始化程序,而不是对象初始化程序:

      new Detail 
      { 
          CId = p.CId, 
          StateInstanceDate = p.InstanceDate, 
          StateName = p.StateName 
      };
      

      或者使用其他构造函数:

      new Detail(p.CId, p.StateInstanceDate, p.StateName);
      

      我认为您失败的地方在于编译器足够聪明,可以处理以下内容:

      new Detail
      {
          p.CId,
          StateInstanceDate = p.InstanceDate,
          p.StateName
      };
      

      通过源类型的属性名称推断属性名称。请注意,您必须明确说明 StateInstanceDate,因为 InstanceDate 不一样。

      【讨论】:

        【解决方案3】:

        BrokenGlass 回答了您的 Detail-initialization 问题,但我想补充一点关于您对 Disposable 模式的使用。考虑这样编码:

        public List<Detail> Getinfo()    
        {  
            using (CaseContext cs = new CaseContext())
            {
                return (from p in cs.table1     
                        join q in cs.table2   
                          on p.StateKey equals q.StateKey  
                          select new Detail 
                          ( 
                              p.CId, 
                              p.InstanceDate, 
                              q.StateName 
                          )
                       ).ToList(); 
            }
        }
        

        即使您的查询抛出,使用也会调用 cs.Dispose()。

        另一个想法 - 考虑像这样输入你的函数......

        public IList<Detail> Getinfo()
        

        如果您使用不同类型的 IList 实现器,甚至更好:

        public IEnumerable<Detail> Getinfo()
        

        只要您不需要 IList-y 的东西,它就更加灵活。

        【讨论】:

          【解决方案4】:

          您在两种初始化形式之间混为一谈,您可以使用构造函数,如下所示:

          new Detail(p.CId, p.InstanceDate, q.StateName)
          

          或者在默认构造之后使用属性初始化,如下所示:

          new Detail { CId = p.CId, StateInstanceDate = p.InstanceDate, StateName = p.StateName }
          

          【讨论】:

            【解决方案5】:
            select new Detail(p.CId, p.InstanceDate, q.StateName);
            

            或

            rselect new Detail 
            {
                CId = p.CId, 
                StateInstanceDate = p.InstanceDate, 
                StateName = q.StateName 
            };
            

            【讨论】:

              【解决方案6】:

              我认为这与这里的部分有关:

              select new Detail
                         { p.CId, p.InstanceDate, q.StateName }
              

              您可能希望使用括号而不是括号。

              【讨论】:

                【解决方案7】:

                使用 System.Web.UI.WebControls; 使用 Trirand.Web.Mvc;

                在此处输入代码

                命名空间示例.Models { 公共类 PersonalModel { 公共 int PersonID { 获取;放; } 公共字符串姓氏{得到;放; } 公共字符串名字 { 获取;放; } 公共字符串地址 { 获取;放; } 公共字符串城市{获取;放; } 公共 JQGrid OrdersGrid { 获取;放; }

                    public PersonalModel()
                    {            
                
                        OrdersGrid = new JQGrid
                                         {
                                             Columns = new System.Collections.List()
                                            {
                                                 new JQGridColumn { DataField = "PersonId", 
                                                                    // always set PrimaryKey for Add,Edit,Delete operations
                                                                    // if not set, the first column will be assumed as primary key
                                                                    PrimaryKey = true,
                                                                    Editable = false,
                                                                    Width = 50 },                                    
                                                 new JQGridColumn { DataField = "FirstName", 
                                                                    Editable = true,
                                                                    Width = 100 },
                                                 new JQGridColumn { DataField = "LastName",                                                         
                                                                    Editable = true,
                                                                    Width = 100, 
                                                                    },
                                                 new JQGridColumn { DataField = "Address", 
                                                                    Editable = true,
                                                                    Width = 75 },
                                                 new JQGridColumn { DataField = "City",
                                                                    Editable =  true
                                                                  }                                     
                                             },
                                             Width = Unit.Pixel(640),
                                             Height = Unit.Percentage(100)
                                         };
                
                        OrdersGrid.ToolBarSettings.ShowRefreshButton = true;            
                    }
                
                }
                

                }

                【讨论】:

                  【解决方案8】:

                  你忘了把 () 放在 new Detail 之后,然后你必须分配 CId = p.CId 之类的属性...

                  【讨论】:

                  • 使用对象初始化语法时不需要()。所以这个答案是完全错误的。
                  • 如果您使用 new Detail(){},您必须为属性命名:{ CId = p.CId // and so on
                  • parens 在使用对象初始化语法时是可选的。让你的生活更清晰。
                  猜你喜欢
                  • 1970-01-01
                  • 2011-01-09
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2018-06-01
                  • 1970-01-01
                  • 2014-12-04
                  • 1970-01-01
                  相关资源
                  最近更新 更多