首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么会发生IEnumerable而不是List

为什么会发生IEnumerable而不是List
EN

Stack Overflow用户
提问于 2010-12-21 04:14:31
回答 5查看 149关注 0票数 0

我有下面的BL方法

代码语言:javascript
运行
复制
public static void SomeMethod (List<SomeClass> group)
{
    IEnumerable<SomeClass> groupWithFalse =(from SomeClass gr in group
                                            where gr.SomeProp== false
                                            select gr);
    foreach (SomeClass grFalse in groupWithFalse)
    {
      grFalse.Save();
    }

    if (groupWithFalse.Any())
    {
      // do some stuff
    }
}

保存dl的模拟实现(不能更改,因为它在许多单元测试中使用)是:

代码语言:javascript
运行
复制
public void Save()
{
   group.SomeProp = true;
}

如果我尝试单元测试流的最后一条语句,例如If (groupWithFalse.Any()),语句将失败,因为显然没有更多的元素将该属性设置为false。如果我将业务逻辑中的代码更改为:

代码语言:javascript
运行
复制
public static void SomeMethod (List<SomeClass> group)
{
    List<SomeClass> groupWithFalse = new List<SomeClass>();
    foreach (var g in group)
    {
      if (g.SomeProp == false)
          groupWithFalse.Add(g);
    }

    foreach (SomeClass grFalse in groupWithFalse)
    {
      grFalse.Save();
    }

    if (groupWithFalse.Any())
    {
      // do some stuff
    }
}

条件语句if (groupWithFalse.Any())在单元测试中不会失败。这一切为什么要发生?谢谢

EN

Stack Overflow用户

回答已采纳

发布于 2010-12-21 04:19:58

运行LINQ查询不会存储结果。

相反,它将在您每次枚举该查询时重新执行该查询。

调用Save()之后,查询将为空,因为没有一个条目满足where子句。

将其更改为

代码语言:javascript
运行
复制
var unsaved = group.Where(g => !g.SomeProp).ToList();

调用ToList()会将结果存储在List<T>中;这可以避免重新执行查询。

票数 3
EN
查看全部 5 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4493484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档