class Program
{
static void Main(string[] args)
{
List<Student> students = new List<Student>();
for (int i = 0; i < 10; i++)
{
students.Add(new Student() { Age = i, Name = "名字" + i });
}
{
Console.WriteLine("********************未使用疊代器 Start*****************************");
List<Student> query = students.WhereNoYield(s =>
{
Thread.Sleep(300);
return s.Age > 0;
});
foreach (var item in query)
{
Console.WriteLine($"{DateTime.Now} - {item.Age} - {item.Name}");
}
Console.WriteLine("********************未使用疊代器 End*****************************");
}
{
Console.WriteLine("********************使用疊代器 Start*****************************");
IEnumerable<Student> query = students.WhereWithYield(s =>
{
Thread.Sleep(300);
return s.Age > 0;
});
foreach (var item in query)
{
Console.WriteLine($"{DateTime.Now} - {item.Age} - {item.Name}");
}
Console.WriteLine("********************使用疊代器 End*****************************");
}
Console.ReadKey();
}
}
public static class MyClass
{
public static IEnumerable<T> WhereWithYield<T>(this IEnumerable<T> list, Func<T, bool> func)
{
foreach (var item in list)
{
if (func.Invoke(item))
{
yield return item;
}
}
}
public static List<T> WhereNoYield<T>(this List<T> list, Func<T, bool> func)
{
List<T> lists = new List<T>();
foreach (var item in list)
{
if (func.Invoke(item))
{
lists.Add(item);
}
}
return lists;
}
}
public class Student
{
public string Name { get; set; }
public int Age { get; set; }
}
通過運作結果時間可以看出:
未使用疊代器,等待“WhereNoYield”函數運算完成後,再進行列印資料
使用疊代器,每次執行“WhereWithYield“函數時,會直接列印資料
