你可枚舉將責令只有一次,在這裏:myIEnumerable.OrderBy(x => x)
在這條線if(iteratorInt == myIEnumerable.First())
它不會被再次訂購。
也許您誤解了IEnumerable.First
方法,IEnumerable.First
和IEnumerable.OrderBy
方法之間沒有關係。
Console.WriteLine(new [] {3, 2, 1}.First());
// here you get 3, not 1.
這裏你可以看到一個自定義OrderBy
方法:
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
public static void Main()
{
var myIEnumerable = GetMyEnumerable();
foreach(var item in myIEnumerable.MyCustomOrderBy(x => x))
{
if(item == myIEnumerable.First())
{
Console.WriteLine("The condition is true with: " + item);
}
}
}
public static IEnumerable<int> GetMyEnumerable()
{
foreach(var i in new int[] {5, 4, 3, 2, 1})
{
Console.WriteLine("GetMyEnumerable was called " + i);
yield return i;
}
}
}
public static class OrderByExtensionMethod
{
public static IOrderedEnumerable<TSource> MyCustomOrderBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
{
Console.WriteLine("OrderByExtensionMethod was called");
return source.OrderBy(keySelector);
}
}
輸出:
OrderByExtensionMethod was called
GetMyEnumerable was called 5
GetMyEnumerable was called 4
GetMyEnumerable was called 3
GetMyEnumerable was called 2
GetMyEnumerable was called 1
GetMyEnumerable was called 5
GetMyEnumerable was called 5
GetMyEnumerable was called 5
GetMyEnumerable was called 5
GetMyEnumerable was called 5
The condition is true with: 5
發生了什麼?
首先調用MyCustomOrderBy
方法,他需要遍歷整個集合來對元素進行排序。
OrderByExtensionMethod was called
GetMyEnumerable was called 5
GetMyEnumerable was called 4
GetMyEnumerable was called 3
GetMyEnumerable was called 2
GetMyEnumerable was called 1
然後你的foreach開始,myIEnumerable.First()
是根據每個項目執行:
GetMyEnumerable was called 5
GetMyEnumerable was called 5
GetMyEnumerable was called 5
GetMyEnumerable was called 5
GetMyEnumerable was called 5
最後,你會得到你想要的東西:
The condition is true with: 5
只需一次,這就是'for'循環的工作原理。 – DavidG
這不會編譯,因爲'myIEnumerable.OrderBy(x => x.MyProperty)'返回'IEnumerable'而不是'IEnumerable '。 –
@TimSchmelter謝謝,我已更改爲OrderBy(x => x)。那是一個錯誤。無論如何,這只是一個例子,表明我正在訂購併且稍後檢查第一個元素。 –