Answers:
var firstFiveItems = myList.Take(5);
或切片:
var secondFiveItems = myList.Skip(5).Take(5);
当然,根据某种顺序获得前五个项目通常很方便:
var firstFiveArrivals = myList.OrderBy(i => i.ArrivalTime).Take(5);
.Take(n)
返回一个TakeIterator。它不会返回其中包含n
元素的列表(假设有很多元素可用)。使用.ToArray()
或.ToList()
在的结果上Take
获取具体的数组或列表。
如果有人感兴趣(即使问题不要求使用该版本),则在C#2中将是:(我根据一些建议对答案进行了编辑)
myList.Sort(CLASS_FOR_COMPARER);
List<string> fiveElements = myList.GetRange(0, 5);
Skip
+ Take
是否很聪明,或者它是否列举了跳过的项目。而且我不需要知道-我只是使用GetRange(在获得列表时)。只要确保您意识到第二个参数是count(而不是last index)。
.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:前五个项目
var pageNumber = 1;
var pageSize = 5;
示例2:后五个项目
var pageNumber = 2;
var pageSize = 5;
示例3:前五个项目
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]);
这将比orderBy变体更快,因为LINQ引擎由于执行延迟而不会扫描所有列表,并且不会对所有数组进行排序。
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)
}
}