C#乱序随机执行多个方法,请问怎么实现呢?

憧憬z 2016-05-25 05:29:46
例如现在有A、B、C、D是个方法,需要打乱顺序执行,4个都要执行,随机顺序,每个执行一次。
排列组合的意思:
1、C > A > B > D
2、D > B > C > A
3、A > D > C > B
...

请问在.NET 2.0中如何实现呢?


/// <summary>
/// 随机乱序执行A、B、C、D
/// </summary>
public void RandomRun()
{
A();
B();
C();
D();
}


public void A()
{ }

public void B()
{ }

public void C()
{ }

public void D()
{ }
...全文
395 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
憧憬z 2016-05-25
  • 打赏
  • 举报
回复
引用 1 楼 shoppo0505 的回复:
大致如下: 1. 放在List里面, List<int, string> (Key, Value) 1 , "A" 2 , "B" 3 , "C" 4 , "D" 2. 娶个随机数 x, (x mod list.length) + 1 3.根据2的结果找到value, 然后删除这个list item 4. switch case 3的结果
感谢答复, 我能想到的也只是这个办法,楼下的更经典
憧憬z 2016-05-25
  • 打赏
  • 举报
回复
引用 4 楼 sp1234 的回复:
当然如果你只是想随机地“仅调用一遍”,就可以从列表中删除待执行的委托。
非常感谢 代码很好 大神是大神
  • 打赏
  • 举报
回复
当然如果你只是想随机地“仅调用一遍”,就可以从列表中删除待执行的委托。
using System;
using System.Collections.Generic;

namespace ConsoleApplication2
{
    class Program
    {
        delegate void Action();

        static void Main(string[] args)
        {
            List<Action> methods = new List<Action> { A, B, C, D };
            while(methods.Count>0)
            {
                var j = rnd.Next(methods.Count);
                var m = methods[j];
                methods.RemoveAt(j);
                m();
            }
            Console.WriteLine("...............按任意键结束");
            Console.ReadKey();
        }

        private static Random rnd = new Random();

        static void A()
        {
            Console.Write("A");
        }

        static void B()
        {
            Console.Write("B");
        }

        static void C()
        {
            Console.Write("C");
        }

        static void D()
        {
            Console.Write("D");
        }
    }
}
  • 打赏
  • 举报
回复
上面代码中使用 var 语法,是因为 c# 编译器使用的是高版本。如果上面的代码是使用4、5年前的 vs 来编译的,你自己把 var 改为具体的类型定义(例如 int)即可。
  • 打赏
  • 举报
回复
.net framework 2.0 那个时代,框架中还没有定义 Action,框架中只是声明了 Action<T> 泛型的定义。所以你需要自己定义一个 Action 委托。
using System;
using System.Collections.Generic;

namespace ConsoleApplication2
{
    class Program
    {
        delegate void Action();

        static void Main(string[] args)
        {
            List<Action> methods = new List<Action> { A, B, C, D };
            for(var i=0; i<1000; ++i)
            {
                var j = rnd.Next(methods.Count);
                var m = methods[j];
                m();
            }
            Console.WriteLine("...............按任意键结束");
            Console.ReadKey();
        }

        private static Random rnd = new Random();

        static void A()
        {
            Console.Write("A");
        }

        static void B()
        {
            Console.Write("B");
        }

        static void C()
        {
            Console.Write("C");
        }

        static void D()
        {
            Console.Write("D");
        }
    }
}
当你使用更高版本的 .net framework 时就不需要自己声明 Action 定义了,可以使用 .net framework 预先定义好的了。
shoppo0505 2016-05-25
  • 打赏
  • 举报
回复
大致如下: 1. 放在List里面, List<int, string> (Key, Value) 1 , "A" 2 , "B" 3 , "C" 4 , "D" 2. 娶个随机数 x, (x mod list.length) + 1 3.根据2的结果找到value, 然后删除这个list item 4. switch case 3的结果

111,092

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧