【问题标题】:LINQ with Skip and Take带有跳过和采取的 LINQ
【发布时间】:2013-03-01 10:08:43
【问题描述】:

我使用下面的代码从IEnumerable 中获取了一些项目,但它总是将源返回为空并计数为0,实际上IEnumerable 中存在项目

private void GetItemsPrice(IEnumerable<Item> items, int customerNumber)
{
    var a = items.Skip(2).Take(5);
}

当我尝试访问a 时,它的计数为0。这里有什么问题吗?

【问题讨论】:

  • 最初集合中有多少项?
  • 不,我还有更多,但就我的问题而言,仅此而已
  • “将源返回为空”是什么意思?而如果a.Count()返回0,那么基本上items中最多有2个元素。如果您认为有 102 项,我怀疑您的诊断不正确。
  • 您似乎还没有枚举您的收藏。 IEnumrables 是延迟加载的,在你告诉它们之前不会做你想做的事情。
  • @SSS:从截图中看不出items.Count()大于2。

标签: c# linq skip take


【解决方案1】:

请记住,代码中的变量a查询本身。这不是查询执行的结果。当您使用即时窗口观看查询时(实际上这与延迟执行的查询有关,否则您将得到结果而不是查询),它将始终显示

{System.Linq.Enumerable.TakeIterator<int>}
    count: 0
    source: null

你可以用这段代码来验证,显然有足够的项目:

int[] items = { 1, 2, 3, 4, 5, 6, 7 };
var a = items.Skip(2).Take(3);

因此,您应该执行查询以查看查询执行结果。在立即窗口中写入:

a.ToList()

你会看到查询执行的结果:

Count = 3
    [0]: 3
    [1]: 4
    [2]: 5

【讨论】:

  • 就是这样。 msdn.microsoft.com/en-us/library/bb503062.aspx "立即返回值是一个对象,它存储了执行该操作所需的所有信息。在通过直接调用其 GetEnumerator 方法或使用 foreach 枚举对象之前,不会执行此方法表示的查询"
  • @Xaruth 是的,这就是所谓的 query:一个存储执行操作所需的所有信息的对象
  • 感谢您的澄清,我需要将此作为参数 items.Skip(2).Take(5) 传递给另一个方法。我需要使用.ToList() 将其作为参数传递吗?
  • 正如我在另一条评论中指出的那样:这就是为什么您不应该使用调试器向您显示您不知道其含义的字段,然后假设您明白意思...
  • @SSS:你可能想要。这取决于。但是您需要了解,您看到 0 的唯一原因是因为您正在查看一个通常无法观察到的 实现细节 字段。它不是序列的长度。
猜你喜欢
  • 1970-01-01
  • 2011-04-21
  • 2011-07-18
  • 1970-01-01
  • 2012-03-23
  • 2011-10-07
  • 1970-01-01
  • 2011-03-11
  • 2013-01-10
相关资源
最近更新 更多