使用google搜尋或瀏覽部落格網站時,都是常會發現有一種設計:在網頁底部會有頁數可讓你瀏覽更多結果或文章。這些網站在渲染結果時,一方面為了改善系統效能,一方面為了使用者體驗,把本來一長串的結果分成好幾頁,讓使用者去瀏覽完這一頁,可以自行選擇到下一頁或者其他頁。
在前幾天Sum Consecutive的例子中,有使用到LINQ的Paging method來簡化。今天就來介紹一些情況可以使用Paging來改寫的情境。
private readonly List<Article> _articles = new List<Article>();
public Article GetFirstArticle(int userId)
{
foreach (var article in _articles)
{
if (article.User.Id == userId)
{
return article;
}
}
return null;
}
⇒ 可以改用 First / Last
private readonly List<Article> _articles = new List<Article>();
public Article GetFirstArticle(int userId)
{
return _articles.First(article => article.User.Id == userId);
}
public IEnumerable<Article> GetArticles(int page, int pageSize)
{
var articles = new List<Article>();
for (var index = 0; index < _articles.Count; index++)
{
if (index >= page * pageSize && index < (page + 1) * pageSize)
{
articles.Add(_articles[index]);
}
}
return articles;
}
⇒ 使用Skip先去除前幾頁,再用Take取得下一頁
public IEnumerable<Article> GetArticles(int page, int pageSize)
{
return _articles.Skip(page * pageSize).Take(pageSize);
}
除了First/Last, Take/Skip,其他還有像是TakeWhile/SkipWhile/Single等操作,在某些情況下也是十分地好用。已經聊過LINQ一些比較常用的Projection and Restriction、Aggregate和Paging method,明天就來聊聊也是的一些Set method。