我想用Linq查詢我的項目中的公交時刻表,以便我隨時可以獲得下5輛公交車到達時間。我怎樣才能限制我的查詢前5個結果?如何在C#中獲得列表的前N個元素?
更一般地,我怎麼可以在C#中的一個列表的片段? (在Python我會用mylist[:5]
拿到第5種元素。)
我想用Linq查詢我的項目中的公交時刻表,以便我隨時可以獲得下5輛公交車到達時間。我怎樣才能限制我的查詢前5個結果?如何在C#中獲得列表的前N個元素?
更一般地,我怎麼可以在C#中的一個列表的片段? (在Python我會用mylist[:5]
拿到第5種元素。)
var firstFiveItems = myList.Take(5);
或者切片:
var secondFiveItems = myList.Skip(5).Take(5);
當然,常常是很方便根據某種率先拿到五個項目順序:
var firstFiveArrivals = myList.OrderBy(i => i.ArrivalTime).Take(5);
如果有人有興趣(即使該問題不問這個版本),在C#2是:(我已經編輯了答案,下面的一些建議)
myList.Sort(CLASS_FOR_COMPARER);
List<string> fiveElements = myList.GetRange(0, 5);
採取第一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)
}
}
如果列表中只包含3個項目,是否會引發異常?或者它會多達5個? – 2012-02-22 21:08:05
@bobek:它不會拋出異常。它只是返回它沒有足夠的元素時所具有的。 – 2012-09-19 04:15:10
準確,沒有拋出異常跳過,並採取綜合解決我的問題,因爲我想採取每批 – JohanLarsson 2015-06-24 09:02:05