c# - 这是一个错误的“PossibleMultipleEnumeration”吗?
问题描述
我有一个IEnumerable
选择。我需要totalCount
(最大选项数),但我只想显示 15 个,比方说。
这段代码性能差吗?Re# 说PossibleMultipleNumerations
,但我的直觉说这是一个错误的。
IEnumerable<someclass> options = from entry in someList select new SomeClass
{ Id = entry.id,
Value = entry.term
};
var totalOptions = options.Count();
var results = options.skip(10).take(15);
解决方案
您目前正在迭代一次 for Count
,然后再一次 forSkip
和Take
。在数数的同时,您也在毫无意义地进行投影。修复所有这些是完全可行的,尽管非常难看。这是应该可以工作的代码(尽管它完全未经测试),并且效率更高,只迭代一次。
// Note: this should be in a static non-generic top-level class.
public static List<TResult> SkipTakeSelectCount<TSource, TResult>(
this IEnumerable<TSource> source,
int skip,
int take,
Func<TSource, TResult> selector,
out int count)
{
List<TResult> page = new List<TResult>();
count = 0;
foreach (var item in source)
{
count++;
if (skip > 0)
{
skip--;
}
else if (take > 0)
{
take--;
page.Add(selector(item));
}
}
return page;
}
你会这样称呼它:
var results = someList.SkipTakeSelectCount(
skip: 10, take: 15,
entry => new SomeClass { Id = entry.Id, Value = entry.Term },
out int totalOptions);
推荐阅读
- python - 如何在 pygame 中使用图像进行碰撞检测
- laravel - 雄辩的创建方法在存储数据后返回“id”0
- java - 如何创建一个函数来确定来自 youtube 的当前视频 URL?
- javascript - 如何从使用 nodejs 的直接链接下载文件
- python - 在 Python 3 中从特定端口读取 TCP 数据包
- excel - Validate if sheet exists before deleting
- azure - 部署 azure sql server 时发现 NoRegisteredProvider
- angular - 通过 Twitter、GitHub、Microsoft 的 Angular FirebaseUI 身份验证不工作
- python - 在 Heroku 上部署 Flask 应用程序
- python - 使用 Python 代码从另一个文件计算情绪数据平均值的 SyntaxError