今天在做礼包系统的时候,有一个看起来很简单的需求。
在十二个礼包里随机挑选四个作为特殊奖励礼包。
这个需求乍一看很简单。
无非就是在1-12中random
一个数,然后再判定一下这个数有没有已经随机过。如此重复四次。
实现起来得两个for
循环嵌套。
确实是很简单,但也很麻烦。
懒狗还是想找找有没有一行就可以解决的办法。
在替换了诸多关键词后,终于被我找到了。
效果为在1-12中随机挑选4个数并编入数组。
int[] selectNumArray = Enumerable.Range(1, 12).OrderBy(t => Guid.NewGuid()).Take(4).ToArray();
Enumerable
是Linq
中常用的一个类,提供一组用于查询实现 IEnumerable<T>
的对象的 static
(在 Visual Basic 中为 Shared
)方法。
而本文用到的Enumerable.Range
方法可以很方便地生成一个指定范围内的连续整数的序列。
//返回一个起始值为startValue
,终止值为endValue
的连续整数序列。
Enumerable.Range(startValue, endValue)
如果将其转换为数组则等效于int[]
.
下列中的两个数组其实是等价的。
int[] NumArray1 = Enumerable.Range(1, 4).ToArray();
int[] NumArray2 = new int[4]{1,2,3,4};
也可以看出在处理和连续整数有关的数据上Enumerable.Range
较之int[]
有着简洁的优势。
OrderBy()
排序,Guid.NewGuid()
生成唯一序列 这些就毋庸赘述了。
int[] selectNumArray = Enumerable.Range(1, 12).OrderBy(t => Guid.NewGuid()).Take(4).ToArray();
整行代码的逻辑即:生成一个1至12的连续整数序列,然后再逐个生成唯一标识符并以此来排序,以实现乱序的效果,再取后四位出来,即1-12中的随机四个数,再将其转成数组。
文中有错误或表述不清的希望大家多多指出,谢谢。