if (time == 1)
            {
                timer1.Stop();
            }
            else if (time == 2)
            {
                timer2.Stop();
            }
            else if (time == 3)
            {
                timer3.Stop();
            }
            else if (time == 4)
            {
                timer4.Stop();
            }
            else if (time == 5)
            {
                timer5.Stop();
            }
            else
            {
                timer6.Stop();
            }
这个垃圾东西,能不能写个循环代替?如果能的话,麻烦高人写一下,谢谢小弟初学C#,实在不会。。莫笑话。。莫笑话3Q3Q

解决方案 »

  1. 呃...
    LZ不会写switch case?
    写循环的话要做映射表或者你的timer要做成数组.
      

  2. switch(time.ToString())
    {
        case "1":
                timer1.Stop();
                break;
        case "2":
                timer2.Stop();
                break;
        case "3":
                timer3.Stop();
                break;
        case "4":
                timer4.Stop();
                break;
        case "5":
                timer5.Stop();
                break;
        default:
                timer6.Stop();
                break;
    }
      

  3. 从效率上来说最快的是用数组.
    假设你所有的定时器都放在一个数组timer里:
    if (time < 6)
      timer[time-1].stop();
    else
      timer[5].stop();
      

  4. 引用 2 楼 gwf25sz 的回复:
    switch(time.ToString()) 

        case "1": 
                timer1.Stop(); 
                break; 
        case "2": 
                timer2.Stop(); 
                break; 
        case "3": 
                timer3.Stop(); 
                break; 
        case "4": 
                timer4.Stop(); 
                break; 
        case "5": 
                timer5.Stop(); 
                break; 
        default…
      

  5. 感谢楼上的switch我意思是,
    当 time =1的时候,是time1.stop().
    当 time =2的时候,是time2.stop().有没有类似for循环一样的东西可以这样一次循环完的?我这里是写了6个,万一有100个timer ....那不是要switch100了
      


  6. 无法将带 [] 的索引应用于“System.Windows.Forms.Timer”类型的表达式
      


  7. 都说了变量timer是个数组....
    也就是说别用timer1 timer2 ... timern这种变量了.
    把它们统一放在一个数组timer里.
      

  8. 我写了一个,你看看能不能运行。
                
                foreach (Control item in this.Controls)
                    if (item.Name == "timer" + time && item is System.Timers.Timer)
                        ((System.Timers.Timer)item).Stop();
      


  9. if (time >= 1 && time <= 6)
                {
                    if (this.Controls["timer" + time.ToString()] is Timer)
                        (this.Controls["timer" + time.ToString()] as Timer).Stop();
                }
      


  10. 无法将类型“myBilliards.Control”转换为“System.Timers.Timer”
      


  11. 无法通过引用转换、装箱转换、取消装箱转换、包装转换或 Null 类型转换将类型“System.Windows.Forms.Control”转换为“System.Windows.Forms.Timer”
      

  12. 是没什么意义,
    你硬要循环的话,你可以把所有的Time保存到泛型集合。
           List<Timer> timers = new List<Timer>();
           timers.Add(this.timer1);
           ......
            public void stopTime(int j)
            {            for (int i = 1; i < timers.Count; i++)
                    if (j == i)
                        timers[i].Stop();
            }
      


  13. 这样的话,假设有100个timer,还是要
    timers.Add() 100次吧。。
    另外下面stopTime()的那个参数j,是什么意思呀这个方法谁调用的?
      

  14. 你可以用循环来添加啦。
     foreach (object var in this.Controls)
                {
                    if (var is Timer)
                        this.timers.Add(var as Timer);
                }
    那个方法就是你要停止那个定时器就传那个参数咯。
    就像你的代码一样就传个time。stopTime(time);
      

  15. 假设你有6个定时器.
    在初始化的时候就不要用timern之类的变量了.
    而是改用数组.记得这个数组必须是你的类的成员变量.
    在类里这样声明:
    Timer [] timer;
    然后在初始化那堆定时器的时候这样写:
    timer = new Timer[6];
    for (int i = 0;i< 6;++i)
    {
      timer[i] = new Timer ();
      //设置定时器的其它参数.
    }剩下的就可以通过timer[n]访问到指定的定时器了.
      

  16. 23楼, yhb417 我把断点放在这一行。this.timers.Add(var as Timer); 结果就没运行这一行呀
      


  17. 应该是:
    timer[time-1].stop();
      

  18. switch(time) 

        case 1: 
                timer1.Stop(); 
                break; 
        case 2: 
                timer2.Stop(); 
                break; 
        case 3: 
                timer3.Stop(); 
                break; 
        case 4: 
                timer4.Stop(); 
                break; 
        case 5: 
                timer5.Stop(); 
                break; 
        default: 
                timer6.Stop(); 
                break; 
    }
      

  19. ((System.Timers.Timer)this.Controls["timer" + time]).Stop();我没试过,但是我觉得理论上应该能转换啊。
      

  20. 哦 我弄错了,原来你的Timer跟我用的不一样。
    代码如下:((System.Windows.Forms.Timer)this.Controls["timer" + time]).Stop();
      

  21. 14 楼的也把 System.Timers.Timer 改成 System.Windows.Forms.Timer 就好了。
      

  22.             
                foreach (Control item in this.Controls)
                    if (item.Name == "timer" + time && item is System.Timers.Timer)
                        ((System.Timers.Timer)item).Stop();
      

  23. static int i=0;静态全局变量
    for(int k=1;k<=6;k++)
    {
        i++;
        if(k==i)
        {
            timer1.Stop(); 
        }
    }
      

  24. 意思已经出来了 LZ调整下就OK
      

  25. Timer[] timer=new Timer[]{timer1,timer2,timer3,timer4,timer5,timer6};
    if(time<6&&time>0)
        timer[time-1].Stop();
    else
        timer6.Stop();
      

  26. static void Stop(int i)
            {
                string[] time=new string[100];
                for (int j = 1; j <= i; j++)
                {
                    time[j] = "time" + j.ToString();
                    if (i == j)
                    {
                        if (j <= 6)
                        {
                            Console.WriteLine(time[j]+".stop()");
                         }
                    }
                }
            }就这样可以了
      

  27. switch(time.ToString()) 

        case "1": 
                timer1.Stop(); 
                break; 
        case "2": 
                timer2.Stop(); 
                break; 
        case "3": 
                timer3.Stop(); 
                break; 
        case "4": 
                timer4.Stop(); 
                break; 
        case "5": 
                timer5.Stop(); 
                break; 
        default: 
                timer6.Stop(); 
                break; 
    }
      

  28. 我理解你那个Timer是线程对象对吧? 是的话用下工厂方法吧using System;
    using System.Collections.Generic;
    using System.Text;
    using System.IO;
    using System.Threading;
    using System.Collections;
    using System.Threading;
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                MyTimer1 mt1 = new MyTimer1();
                AbstractTimeFactoryHelp.Run(mt1, new AbstractTimeFactoryHelp.Timestart(mt1.PlayGame));            MyTimer2 mt2 = new MyTimer2();
                AbstractTimeFactoryHelp.Run(mt2, new AbstractTimeFactoryHelp.Timestart(mt2.PlayGame));
                
                //效果是,无需再判断time == n 了
                TimeStop(mt1);
                TimeStop(mt2);
            }
                  //这里是你以前的代码,该成以下
                //if (time == 1)
                //{
                //    timer1.Stop();
                //}
                //else if (time == 2)
                //{
                //    timer2.Stop();
                //}
                //else if (time == 3)
                //{
                //    timer3.Stop();
                //}
                //else if (time == 4)
                //{
                //    timer4.Stop();
                //}
                //else if (time == 5)
                //{
                //    timer5.Stop();
                //}
                //else
                //{
                //    timer6.Stop();
                //}        改好后的
            static void TimeStop(AbstractTimer time)
            {
                AbstractTimeFactoryHelp.Stop(time);
            }
        }    /// <summary>
        /// 抽象Timer基类,只定义成员
        /// </summary>
        public abstract class AbstractTimer
        {
            public Thread time;
        }    /// <summary>
        /// 工厂,用于定义类的函数,以后需要添加新方法,就直接根据抽象基类的参数,
        /// 向里面填充就可以了,可以保证每一个继承抽象基类的子类都拥有同样的方法
        /// </summary>
        public class AbstractTimeFactoryHelp
        {
            public delegate void Timestart();        public static void Run(AbstractTimer timer, Timestart start)
            {
                if (isRun(timer))
                {
                    timer.time = new Thread(new ThreadStart(start));
                }
            }        public static void Stop(AbstractTimer timer)
            {
                if (isRun(timer))
                {
                    timer.time.Abort();
                    timer.time = null;
                }
            }        static bool isRun(AbstractTimer timer)
            {
                if (null != timer.time)
                {
                    if (timer.time.IsAlive)
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
                else
                {
                    return false;
                }
            }
        }
        public class MyTimer1 : AbstractTimer
        {
            public void PlayGame()
            {
                Console.WriteLine("My Name is PlayGame1");
            }
        }    public class MyTimer2 : AbstractTimer
        {
            public void PlayGame()
            {
                Console.WriteLine("My Name is PlayGame2");
            }
        }
    }
      

  29. 少写个Start: 改了一下using System;
    using System.Collections.Generic;
    using System.Text;
    using System.IO;
    using System.Threading;
    using System.Collections;
    using System.Threading;
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                MyTimer1 mt1 = new MyTimer1();
                AbstractTimeFactoryHelp.Run(mt1, new AbstractTimeFactoryHelp.Timestart(mt1.PlayGame));            MyTimer2 mt2 = new MyTimer2();
                AbstractTimeFactoryHelp.Run(mt2, new AbstractTimeFactoryHelp.Timestart(mt2.PlayGame));
                Thread.Sleep(500);
                TimeStop(mt1);
                TimeStop(mt2);
                Console.Read();
            }
                  //这里是你以前的代码,该成以下
                //if (time == 1)
                //{
                //    timer1.Stop();
                //}
                //else if (time == 2)
                //{
                //    timer2.Stop();
                //}
                //else if (time == 3)
                //{
                //    timer3.Stop();
                //}
                //else if (time == 4)
                //{
                //    timer4.Stop();
                //}
                //else if (time == 5)
                //{
                //    timer5.Stop();
                //}
                //else
                //{
                //    timer6.Stop();
                //}        改好后的
            static void TimeStop(AbstractTimer time)
            {
                AbstractTimeFactoryHelp.Stop(time);
            }
        }    /// <summary>
        /// 抽象Timer基类,只定义成员
        /// </summary>
        public abstract class AbstractTimer
        {
            public Thread time;
        }    /// <summary>
        /// 工厂,用于定义类的函数,以后需要添加新方法,就直接根据抽象基类的参数,
        /// 向里面填充就可以了,可以保证每一个继承抽象基类的子类都拥有同样的方法
        /// </summary>
        public class AbstractTimeFactoryHelp
        {
            public delegate void Timestart();        public static void Run(AbstractTimer timer, Timestart start)
            {
                if (!isRun(timer))
                {
                    timer.time = new Thread(new ThreadStart(start));
                    timer.time.Start();
                }
            }        public static void Stop(AbstractTimer timer)
            {
                if (isRun(timer))
                {
                    timer.time.Abort();
                    timer.time = null;
                }
            }        static bool isRun(AbstractTimer timer)
            {
                if (null != timer.time)
                {
                    if (timer.time.IsAlive)
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
                else
                {
                    return false;
                }
            }
        }
        public class MyTimer1 : AbstractTimer
        {
            public void PlayGame()
            {
                Console.WriteLine("My Name is PlayGame1");
            }
        }    public class MyTimer2 : AbstractTimer
        {
            public void PlayGame()
            {
                Console.WriteLine("My Name is PlayGame2");
            }
        }
    }
      

类似问题 »