IEnumerable与List的区别

3
这是使用 IEnumerable 的正确方式,还是应该使用 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;
    }

关于你更新的问题.. 你不需要准备那样的列表,看看我给你的例子就好了 ;) - Łukasz W.
顺便说一句,你的linq查询看起来很奇怪。如果你的dbml具有关系,则不需要join。返回db.GetDb().NewsCat_ITEMs.Where(x=>x.VIRTUAL_ITEMs.VI_VF_ID == FID).ToList(); - itchi
3个回答

3
该列表是类型的实例,实现了IEnumerable。这意味着如果您想返回IEnumerable,则必须创建一个该类型的列表(或数组等),然后返回它。从方法外部看,它将看起来像您正在返回IEnumerable,但实际上它将是List。
关于您的查询... 您必须选择类型为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();
}

现在我得到了以下错误信息:无法找到类型或命名空间名称为“PropertyInfo”(您是否缺少一个使用指示或程序集引用?) - eyalb
public static IEnumerable<newsListItems> 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 newsListItems { tt = nls, tt2 = vi });return result.ToList();} - eyalb
你确定你在某个地方定义了newsListItems类吗?你能给我展示它的代码吗? - Łukasz W.
不,我没有一个名为“newsListItems”的类。我以为它可能是一种新的对象类型,我需要创建它吗?它是从我的数据库中连接的表。有没有其他方法可以返回“result”? - eyalb
不可以在方法中返回匿名类型。您必须创建一个表示实体的类(在这种情况下从连接的表中获取)。另外,为什么在方法定义中加入<T>?因为您在方法体中没有使用它,所以考虑将其删除 ;) - Łukasz W.
返回 nls,因为它很可能包含 IEnumerable<VIRTUAL_ITEM>。 - itchi

3

这取决于您想如何使用结果。IEnumerable 基本上只支持遍历集合中包含的结果。IList 更具体,允许您:

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

除此之外还有其他功能。如果您不需要额外的功能,我会返回 IEnumerable。您方法的调用者可以像您一样将项添加到列表中。


0

如果它是 IEnumerable<PropertyInfo> 的实现,那么你可以返回一个 List<PropertyInfo>。唯一的问题是,一旦返回,调用函数看到的只是一个普通的 IEnumerable


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接