Reshaperから「 IEnumerableの複数の列挙の可能性」という警告が表示されます。それをどのように処理するかは、別のSOの質問ですでに尋ねられています。私の質問はもう少し具体的ですが、警告がポップアップするさまざまな場所についてです。
私が疑問に思っているのは、Resharperが私にこの警告を与えるのが正しいかどうかです。私の主な懸念は、コードで「」で示されている以下の変数のすべてのインスタンスで警告が発生することです。users
//Warn
私のコードは、グリッド内のWebページに表示される情報を収集しています。データセット全体の長さが数万から数十万行になる可能性があるため、サーバー側のページングを使用しています。私は可能な限りコードにコメントしました。
繰り返しになりますが、このコードが複数の列挙の影響を受けやすいかどうかを教えてください。私の目標は、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
}