回答:
var firstFiveItems = myList.Take(5);
またはスライスする:
var secondFiveItems = myList.Skip(5).Take(5);
そしてもちろん、多くの場合、最初の5つのアイテムを何らかの順序に従って取得すると便利です。
var firstFiveArrivals = myList.OrderBy(i => i.ArrivalTime).Take(5);
.Take(n)
TakeIterator を返すことに注意してください。n
要素が含まれているリストは返されません(その数が利用可能であると想定)。具体的な配列またはリストを取得するには、の結果で.ToArray()
or .ToList()
を使用しTake
ます。
誰かが興味を持っている場合(質問でこのバージョンが要求されない場合でも)、C#2では次のようになります(私はいくつかの提案に従って、回答を編集しました)
myList.Sort(CLASS_FOR_COMPARER);
List<string> fiveElements = myList.GetRange(0, 5);
Skip
+ Take
が同じくらい賢いのか、それともスキップされたアイテムを列挙するのかわかりません。そして、私は知る必要はありません-GetListを使用するだけです(リストが与えられた場合)。2番目のパラメーターが(最後のインデックスではなく)countであることを確認してください。
.Take(n)
は、n
それが機能するシーケンスの要素よりも少ない場合でも心配する必要がないことです。問題List<T>.GetRange(0, count)
はあなたが心配しArgumentException
なければならないことです... count
アイテムがない場合はあなたが得るでしょう。
同様にpagination
あなたが取るためのフォーミュラの下に使用することができますslice of list or elements
:
var slice = myList.Skip((pageNumber - 1) * pageSize)
.Take(pageSize);
例1:最初の5つのアイテム
var pageNumber = 1;
var pageSize = 5;
例2:2番目の5つのアイテム
var pageNumber = 2;
var pageSize = 5;
例3:3番目の5つのアイテム
var pageNumber = 3;
var pageSize = 5;
予告フォーミュラパラメータにする場合
pageSize = 5
とpageNumber
、あなたが変更スライス内の項目数を変更したい場合は、変更されますpageSize
。
最初の5つの要素を取得するには、次のような式を使用します。
var firstFiveArrivals = myList.Where([EXPRESSION]).Take(5);
または
var firstFiveArrivals = myList.Where([EXPRESSION]).Take(5).OrderBy([ORDER EXPR]);
LINQエンジンは実行の遅延のためにすべてのリストをスキャンせず、すべての配列をソートしないため、orderByバリアントよりも高速になります。
class MyList : IEnumerable<int>
{
int maxCount = 0;
public int RequestCount
{
get;
private set;
}
public MyList(int maxCount)
{
this.maxCount = maxCount;
}
public void Reset()
{
RequestCount = 0;
}
#region IEnumerable<int> Members
public IEnumerator<int> GetEnumerator()
{
int i = 0;
while (i < maxCount)
{
RequestCount++;
yield return i++;
}
}
#endregion
#region IEnumerable Members
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
throw new NotImplementedException();
}
#endregion
}
class Program
{
static void Main(string[] args)
{
var list = new MyList(15);
list.Take(5).ToArray();
Console.WriteLine(list.RequestCount); // 5;
list.Reset();
list.OrderBy(q => q).Take(5).ToArray();
Console.WriteLine(list.RequestCount); // 15;
list.Reset();
list.Where(q => (q & 1) == 0).Take(5).ToArray();
Console.WriteLine(list.RequestCount); // 9; (first 5 odd)
list.Reset();
list.Where(q => (q & 1) == 0).Take(5).OrderBy(q => q).ToArray();
Console.WriteLine(list.RequestCount); // 9; (first 5 odd)
}
}