C#扩展(2):Random的扩展

来源:互联网 发布:js 设置style display 编辑:程序博客网 时间:2024/05/21 01:51

在.net中关于Random一共也只有这几个方法
    //    // 摘要:    //     表示伪随机数生成器,一种能够产生满足某些随机性统计要求的数字序列的设备。    [ComVisible(true)]    public class Random    {        //        // 摘要:        //     使用与时间相关的默认种子值,初始化 System.Random 类的新实例。        public Random();        //        // 摘要:        //     使用指定的种子值初始化 System.Random 类的新实例。        //        // 参数:        //   Seed:        //     用来计算伪随机数序列起始值的数字。如果指定的是负数,则使用其绝对值。        public Random(int Seed);        //        // 摘要:        //     返回一个非负随机整数。        //        // 返回结果:        //     大于等于零且小于 System.Int32.MaxValue 的 32 位带符号整数。        [TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]        public virtual int Next();        //        // 摘要:        //     返回一个小于所指定最大值的非负随机整数。        //        // 参数:        //   maxValue:        //     要生成的随机数的上限(随机数不能取该上限值)。maxValue 必须大于或等于零。        //        // 返回结果:        //     大于等于零且小于 maxValue 的 32 位带符号整数,即:返回值的范围通常包括零但不包括 maxValue。不过,如果 maxValue 等于零,则返回        //     maxValue。        //        // 异常:        //   T:System.ArgumentOutOfRangeException:        //     maxValue 小于零。        public virtual int Next(int maxValue);        //        // 摘要:        //     返回在指定范围内的任意整数。        //        // 参数:        //   minValue:        //     返回的随机数的下界(随机数可取该下界值)。        //        //   maxValue:        //     返回的随机数的上界(随机数不能取该上界值)。maxValue 必须大于或等于 minValue。        //        // 返回结果:        //     一个大于等于 minValue 且小于 maxValue 的 32 位带符号整数,即:返回的值范围包括 minValue 但不包括 maxValue。如果        //     minValue 等于 maxValue,则返回 minValue。        //        // 异常:        //   T:System.ArgumentOutOfRangeException:        //     minValue 大于 maxValue。        public virtual int Next(int minValue, int maxValue);        //        // 摘要:        //     用随机数填充指定字节数组的元素。        //        // 参数:        //   buffer:        //     包含随机数的字节数组。        //        // 异常:        //   T:System.ArgumentNullException:        //     buffer 为 null。        public virtual void NextBytes(byte[] buffer);        //        // 摘要:        //     返回一个介于 0.0 和 1.0 之间的随机浮点数。        //        // 返回结果:        //     大于等于 0.0 并且小于 1.0 的双精度浮点数。        [TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]        public virtual double NextDouble();        //        // 摘要:        //     返回一个介于 0.0 和 1.0 之间的随机浮点数。        //        // 返回结果:        //     大于等于 0.0 并且小于 1.0 的双精度浮点数。        [TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]        protected virtual double Sample();    }

C#关于Random提供的三种实例方法(1).Next()  (2).NextBytes   (3).NextDouble()

提供的方法很少,所以我们很有必要我们可以扩展一下

.Net Random常用扩展

Enum:枚举的扩展

 public static T NextEnum<T>(this Random random) where T : struct        {            Type type = typeof(T);  //获取返回值的类型            if (type.IsEnum == false) throw new InvalidOperationException();            var array = Enum.GetValues(type);            var index = random.Next(array.GetLowerBound(0), array.GetLowerBound(0));            return (T)array.GetValue(index);        }
调用事例

enum Week    {        Monday = 1,        TuesDay = 2,        WndnesDay = 3,        ThurDay = 4,        FriDay = 5,        SaturDay = 6,        SunDay = 0    } Random random = new Random(); Console.WriteLine(random.NextEnum<Week>());
相关语法看不懂,我就不解释了。

Enum:byte的扩展

public static byte[] NextBytes(this Random random, int length)        {            //question:NextBytes这个方法和Random 对象自带的方法是一样,会不会报错?            //questio:最大的byte是多少,这个不知道自己打脸,真心要打脸            var  result =new byte[length];            random.NextBytes(result);             // 用随机数填充指定字节数组的元素。参数result:一个byte数组,不断往里面填充byte 类型的数字            return result;        }调用:  byte[] data = random.NextBytes(12);

Bool:bool的扩展

    public static bool NextBool(this Random random)        {            return random.NextDouble() > 0.5;        }调用:Random rand = new Random();Console.WriteLine(rand.NextBool());

字符串:符合正则的随机密码

var password = random.NextString(@"[0-9a-z]{6,12}");var passwordSalt = random.NextString(@"[a-z0-9A-Z]{16}");

字符串的扩展(一个实际项目中的问题)

是这样的,在前端中经常有这样需求,将一个任务分配给多个人。这个时候会获取多个人的Id组成的字符串,所以在后端程序处理的时候,我们就要将这个字符串分割成Id重新复制成int 类型的Array.我是这样做的,希望有好的方法提出,虽然不是最好,但还是解决了一些问题


        /// <summary>        /// 字符串转化成int数组        /// </summary>        /// <param name="arrayParmeter">具有分割符的字符串</param>        /// <param name="c">分割符</param>        /// <returns>success:返回元祖<list,true>,,error:<null,false></returns>        public static  Tuple<int[],bool> StringParseArrayInt(this string strParmeter,char c)        {            Tuple<int[], bool> ret = null;            List<int> list = new List<int> ();            string[] arrayStr = strParmeter.Split(c);            try{                foreach (string item in arrayStr)                {                   int temp = 0;                   int.TryParse(item, out temp);                   list.Add(temp);                }            }            catch            {                ret = new Tuple<int[], bool>(null, false);                return ret;            }            ret = new Tuple<int[], bool>(list.ToArray(),true);            return ret;        }

希望大家多提点意见,谢谢了


1 0