我从 Reshaper 收到“ IEnumerable 的可能多重枚举”警告。如何处理它已经在另一个 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
}