IEnumerable vs List

时间:2010-08-11 05:43:36

标签: c# asp.net linq-to-sql

这是IEnumerable或shell使用List的正确用法吗? 我需要放入<PropertyInfo>

public static IEnumerable<PropertyInfo> GetNewsList<T>(int FID)
    {
        CatomWebNetDataContext pg = (CatomWebNetDataContext)db.GetDb();
        return (from nls in pg.NewsCat_ITEMs
                  join vi in pg.VIRTUAL_ITEMs on nls.NC_VI_ID equals vi.VI_ID
                  where vi.VI_VF_ID == FID
                  select new { nls, vi });


    }

 public List<PropertyInfo> GetPublic<T>(int FID)
    {
        CatomWebNetDataContext pg = (CatomWebNetDataContext)db.GetDb();
        var nl = (from nls in pg.NewsCat_ITEMs
                join vi in pg.VIRTUAL_ITEMs on nls.NC_VI_ID equals vi.VI_ID
                where vi.VI_VF_ID == FID
                select new { nls, vi });

        List<PropertyInfo> retList = new List<PropertyInfo>();

        foreach (var item in nl)
        {
             retList.Add(item);
        }


        return retList;
    }

3 个答案:

答案 0 :(得分:3)

列表是类型的实例,它实现了IEnumerable。这是什么意思?如果你想返回IEnumerable<PropertyInfo>,你必须创建它的列表(或数组等),然后返回它。从方法的外部看起来你将返回IEnumerable<PropertyInfo>但实际上它将是List<PropertyInfo>

关于您的查询...您必须选择PropertyInfo类型的对象,但现在您返回一些匿名类型。你应该这样试试:

public static IEnumerable<PropertyInfo> GetNewsList<T>(int FID)
{
    CatomWebNetDataContext pg = (CatomWebNetDataContext)db.GetDb();
    var result from nls in pg.NewsCat_ITEMs
               join vi in pg.VIRTUAL_ITEMs on nls.NC_VI_ID equals vi.VI_ID
               where vi.VI_VF_ID == FID
               select new PropertyInfo { SomeMember = nls, SomeOtherMember = vi };

    return result.ToList();
}

答案 1 :(得分:3)

这取决于你想对结果做什么。 IEnumerable基本上只支持迭代集合中包含的结果。 IList更具体,允许您:

  • 找出集合中有多少项而不遍历所有项目
  • 轻松访问列表中特定位置的项目
  • 在列表中添加或删除项目

等等。如果您不需要额外的功能,我会返回IEnumerable。您的方法的调用者可以轻松地执行将项目添加到List中所执行的操作。

答案 2 :(得分:0)

您可以返回List<PropertyInfo>,因为它是IEnumerable<PropertyInfo>的实现。唯一的一点就是它一旦返回就会看起来像调用函数的普通旧IEnumerable