yield 与 IEnumerable<T> 结对出现, 可实现按需获取 , 迭代器模式
static void Main(string[] args)
{
try
{
{
//Console.WriteLine("***************Collection**************");
CollectionDemo.Show();
}
{
Console.WriteLine("*******************Yield********************");
YieldDemo yieldDemo = new YieldDemo();
foreach (var item in yieldDemo.Power())
{
Console.WriteLine(item);//按需获取,要一个拿一个
if (item > 100)
break;
}
Console.WriteLine("*******************************************");
foreach (var item in yieldDemo.Common())
{
Console.WriteLine(yieldDemo.Common().Count());//先全部获取,然后一起返还
if (item > 100)
break;
}
}{
List<string> fruits =
new List<string> { "apple", "passionfruit", "banana", "mango",
"orange", "blueberry", "grape", "strawberry" };IEnumerable<string> query = fruits.Where(fruit => fruit.Length < 6);
foreach (var item in query)//遍历才会去查询比较 迭代器 yield
{}
IQueryable<string> queryable = fruits.AsQueryable<string>().Where(s => s.Length <6);
foreach (var item in queryable)//表达式目录树的解析,延迟到遍历的时候才去执行 EF的延迟查询
{}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.Read();
}
public class YieldDemo
{
public IEnumerable<int> Power()
{
for (int i = 0; i < 10; i++)
{
yield return this.Get(i);
//yield return this.Get(i);//Console.WriteLine("这里再来一次");
//yield return this.Get(i) + 1;
}
}public IEnumerable<int> Common()
{
List<int> intList = new List<int>();
for (int i = 0; i < 10; i++)
{
intList.Add(this.Get(i));
}
return intList;
}private int Get(int num)
{
Thread.Sleep(2000);
return num * DateTime.Now.Second;
}}
public static class ExtendMethod
{
public static IEnumerable<T> ElevenWhere<T>(this IEnumerable<T> source, Func<T, bool> func)
{
if (source == null)
{
throw new Exception("source is null");
}
if (func == null)
{
throw new Exception("func is null");
}
foreach (var item in source)
{
if (func.Invoke(item))
{
yield return item;
}
}
}
}