首页 > 解决方案 > 这是一个错误的“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);

标签: c#resharper

解决方案


您目前正在迭代一次 for Count,然后再一次 forSkipTake。在数数的同时,您也在毫无意义地进行投影。修复所有这些是完全可行的,尽管非常难看。这是应该可以工作的代码(尽管它完全未经测试),并且效率更高,只迭代一次。

// 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);

推荐阅读