demo:
int Count = 0;
string[] obj = { "item1", "item2", "item3", "item4", "item5", "item6" };
var query = obj.Where(item => IsTrue(item));
// 第一次遍历
foreach (var item in query)
{
Console.WriteLine(item);
}
Console.WriteLine();
// 第二次遍历
query.ToList(); //ToList() 会导致遍历整个查询
// 第三次遍历
if (query.Any()) // Any() 也会导致遍历,找到则返回
{
Console.WriteLine("At least one item is true.\r\n");
}
if (query.Count() > 0)//Count() 会全部遍历
{
Console.WriteLine("Count > 0");
}
bool IsTrue(string item)
{
Count++;
Console.WriteLine($"IsTrue is called:{Count},{Count % 2 == 0}---------{item}");
return Count % 2 == 0; // 示例中总是返回true
}
结果
IsTrue is called:1,False---------item1
IsTrue is called:2,True---------item2
item2
IsTrue is called:3,False---------item3
IsTrue is called:4,True---------item4
item4
IsTrue is called:5,False---------item5
IsTrue is called:6,True---------item6
item6
IsTrue is called:7,False---------item1
IsTrue is called:8,True---------item2
IsTrue is called:9,False---------item3
IsTrue is called:10,True---------item4
IsTrue is called:11,False---------item5
IsTrue is called:12,True---------item6
IsTrue is called:13,False---------item1
IsTrue is called:14,True---------item2
At least one item is true.
IsTrue is called:15,False---------item1
IsTrue is called:16,True---------item2
IsTrue is called:17,False---------item3
IsTrue is called:18,True---------item4
IsTrue is called:19,False---------item5
IsTrue is called:20,True---------item6
Count > 0