gpt4 book ai didi

c# - 关于 "Possible Multiple Enumeration"可枚举的 *所有* 使用的 Resharper 警告

转载 作者:太空狗 更新时间:2023-10-30 01:07:03 27 4
gpt4 key购买 nike

我从 Reshaper 收到“Possible Multiple Enumeration of IEnumerable”警告。如何处理已经asked in another SO question .不过,我的问题稍微具体一些,关于警告会弹出的不同位置。

我想知道 Resharper 给我这个警告是否正确。我主要担心的是下面的 users 变量的警告发生在 所有 实例,在代码中由“//Warn”。

我的代码正在收集信息以显示在网格中的网页上。我正在使用服务器端分页,因为整个数据集可能有数万或数十万行。我已尽可能对代码进行注释。

再次请告知此代码是否容易受到多重枚举的影响。我的目标是在 调用 ToList() 之前执行数据过滤和排序。这是执行此操作的正确方法吗?

private List<UserRow> GetUserRows(UserFilter filter, int start, int limit,
string sort, SortDirection dir, out int count)
{
count = 0;

// LINQ applies filter to Users object
var users = (
from u in _userManager.Users
where filter.Check(u)
select new UserRow
{
UserID = u.UserID,
FirstName = u.FirstName,
LastName = u.LastName,
// etc.
}
);

// LINQ orders by given sort
if (!String.IsNullOrEmpty(sort))
{
if (sort == "UserID" && dir == SortDirection.ASC)
users = users.OrderBy(u => u.UserID); //Warn
else if (sort == "UserID" && dir == SortDirection.DESC)
users = users.OrderByDescending(u => u.UserID); //Warn
else if (sort == "FirstName" && dir == SortDirection.ASC)
users = users.OrderBy(u => u.FirstName); //Warn
else if (sort == "FirstName" && dir == SortDirection.DESC)
users = users.OrderByDescending(u => u.FirstName); //Warn
else if (sort == "LastName" && dir == SortDirection.ASC)
users = users.OrderBy(u => u.LastName); //Warn
else if (sort == "LastName" && dir == SortDirection.DESC)
users = users.OrderByDescending(u => u.LastName); //Warn
// etc.
}
else
{
users = users.Reverse(); //Warn
}

// Output variable
count = users.Count(); //Warn

// Guard case - shouldn't trigger
if (limit == -1 || start == -1)
return users.ToList(); //Warn

// Pagination and ToList()
return users.Skip((start / limit) * limit).Take(limit).ToList(); //Warn
}

最佳答案

是的,ReSharper是对的:count = users.Count();无条件枚举,然后如果limit或者start1 不是负数,ToList 将再次枚举 users

看起来,一旦 ReSharper 确定某些东西有被多次枚举的风险,它就会用多重枚举警告标记对有问题的项目的每一次引用,即使它不是负责多重枚举的代码。这就是为什么您会在这么多行中看到警告。

更好的方法是添加一个单独的调用来设置计数。您可以在单独的声明中预先完成,如下所示:

count = _userManager.Users.Count(u => filter.Check(u));

这样您就可以将 users 保留在其预枚举状态,直到最终调用 ToList

关于c# - 关于 "Possible Multiple Enumeration"可枚举的 *所有* 使用的 Resharper 警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13686870/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com