你可枚举将责令只有一次,在这里: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)。那是一个错误。无论如何,这只是一个例子,表明我正在订购并且稍后检查第一个元素。 –