如何撤消LINQ中的skip / take?

时间:2018-01-08 09:33:35

标签: c# linq

我正在使用LINQ跳过List并且我想撤消跳过并拍摄以便我可以获得整个收藏。

例如

List<int> aThousandObjects = Enumerable.Range(1,1000).ToList();

List<object> list = aThousandObjects;
int listOriginalLength = list.Count();
int take = 100;

for(int taken = 0; taken < Math.Ceiling((double) listOriginalLength / 100) * 100; taken += take)
{
    list = list.Skip(take);
    updateValues(list.Take(take));
}

现在我想这样做是真的

list.Count() == listOriginalLength

这样我才能做到这一点

IEnumerable<object> newValues = list.Select(x => x.NewValue);

没有得到“没有结果”

Enumeration yielded no results

1 个答案:

答案 0 :(得分:6)

除非通过讨厌的反射来获取内部字段,否则无法打开合成查询。

但是:你可以回到原来的那个:

IEnumerable<object> list = aThousandObjects;
// compose LINQ etc...

// undo!
list = aThousandObjects;

这里的每个LINQ操作都是通过将一个IEnumerable<T>封装在另一个内部来组成的。如果您随时快照(通过将当前可枚举存储在本地等):您可以返回到该快照 - 您无需返回到根列表。