首先看看原代码:
foreach (var ExecuteTask in Tasks.Where(m => m.BeginTime <= VirtualDate).ToArray())
{
Task.Run(ExecuteTask.SchdeulerTask);
if (ExecuteTask.SchedulerType == SchedulerType.TimeOut)
{
Tasks.Remove(ExecuteTask);
}
else
{
ExecuteTask.BeginTime = VirtualDate.AddMilliseconds(ExecuteTask.Interval);
}
}
【用的是 foreach遍历】
说说foreach的用法:用于列举集合中所有的元素,foreach语句中的 表达式由关键字in 隔开的两个项组成。in左边是变量名,用于存放该集合中的每个元素。
循环过程:每次循环,从集合中取出一个新的元素值,放到只读变量中去,如果括号中对的整个表达式返回值是 true,foreach块中的语句就能执行。一旦集合中的元素都已经被访问到,整个表达式的值为false,控制流程就转入到foreach块后面的执行语句。
foreach经常与数组一起使用。
数组的属性:Array.Length数组的容量。
遍历数组:foreach(type objName in collection/Array)
【必须注意的是,借助foreach,只能一一取得数组中的元素,并不能利用这种语句改变数组所存储的元素。】
很明显 Tasks.Remove(ExecuteTask);,违反了最后这条规则,毕竟foreach选出来的 卖艺不卖身,不能对本身造成更改,获取相应元素的身高三围。。。咳咳。。。的信息就行了。
更改后:
var ExecuteTask = Tasks.Where(m => m.BeginTime <= VirtualDate).ToArray();
for (int i =0;i< ExecuteTask.Length;i++) {
Task.Run(ExecuteTask[i].SchdeulerTask);
if (ExecuteTask[i].SchedulerType == SchedulerType.TimeOut)
{
Tasks.Remove(ExecuteTask[i]);
}
else
{
ExecuteTask[i].BeginTime = VirtualDate.AddMilliseconds(ExecuteTask[i].Interval);
}
}
【使用for遍历】
for循环遍历的自由度比较大,但是需要给他初值,限制条件,但是可以每一个遍历值进行不可描述的操作。。。
话说,foreach,对应操作的是集合,c#中哪些是常用的集合呢:
ArrayList 非泛型集合
HashTable(哈希表、散列表) 非泛型集合
List泛型集合
Dictionary<K,V>
Queue
Stack
等。。。。