随机索引生成
当时写这个类是因为商务那边需要页面内容随机显示,但是数据是以泛型的形式放在缓存中,所以没可能每次用户刷新页面均访问数据库,所以,对泛型的随机排序需求应运而生.我采用了随机生成索引列表,然后根据索引列表来获取泛型中数据来实现随机.随机索引列表使用抽牌形式进行,避免了random函数的一些问题...
Code
1/**//// <summary>
2 /// 随机索引生成类
3 /// </summary>
4 /// <example>
5 /// private static List(int) showList = new List(int)(); //定义静态索引
6 /// //调用索引
7 /// if (showList.Count < 50)
8 /// showList = MyLibrary.SimpleFunction.RandomFunction.RandomIndex.Run().GetRandomIndex(50);
9 /// else
10 /// showList = MyLibrary.SimpleFunction.RandomFunction.RandomIndex.Run().GetRandomIndex(showList);
11 /// foreach (int i in showList)
12 /// Response.Write(i + ",");
13 /// </example>
14 public class RandomIndex
15 {
16 Random rnd = new Random();
17 private static List<int> indexList = new List<int>();
18
19 private static RandomIndex randomIndex;
20 private RandomIndex(int length)
21 {
22 for (int i = 0; i < length; i++)
23 indexList.Add(i);
24 }
25 /**//// <summary>
26 /// 静态调用方法
27 /// </summary>
28 /// <param name="length">索引长度</param>
29 /// <returns></returns>
30 public static RandomIndex Run(int length)
31 {
32 if (randomIndex == null) randomIndex = new RandomIndex(length);
33 return randomIndex;
34 }
35
36 /**//// <summary>
37 /// 生成随机索引,从0开始,到length-1
38 /// 必须使用有参构造方法
39 /// </summary>
40 /// <returns></returns>
41 public List<int> GetRandomIndex()
42 {
43 int randomNumber = rnd.Next(1000, 2000);
44 Random r = new Random(unchecked((int)DateTime.Now.Ticks));
45
46 for (int i = 0; i < randomNumber; i++)
47 {
48 int index = r.Next(0, indexList.Count);
49 if (indexList.Remove(index))
50 indexList.Add(index);
51 }
52 List<int> newList = new List<int>();
53 for (int i = indexList.Count - 1; i >= 0; i--)
54 {
55 newList.Add(indexList[i]);
56 }
57
58 return newList;
59 }
60
61 //--------↑使用静态方法生成随机索引---------------------------//
62 //--------↓静态索引定义在调用类中,此处只提供生成--------------//
63
64 private RandomIndex() { }
65 /**//// <summary>
66 /// 静态调用方法
67 /// </summary>
68 /// <returns></returns>
69 public static RandomIndex Run()
70 {
71 if (randomIndex == null)
72 randomIndex = new RandomIndex();
73 return randomIndex;
74 }
75 /**//// <summary>
76 /// 对现有索引表进行随机排序
77 /// 修正了多次调用导致长度无法统一问题
78 /// currentList可由调用的类来控制长度
79 /// </summary>
80 /// <param name="currentList"></param>
81 /// <returns></returns>
82 public List<int> GetRandomIndex(List<int> currentList)
83 {
84 int randomNumber = rnd.Next(1000, 2000);
85 Random r = new Random(unchecked((int)DateTime.Now.Ticks));
86
87 for (int i = 0; i < randomNumber; i++)
88 {
89 int index = r.Next(0, currentList.Count);
90 if (currentList.Remove(index))
91 currentList.Add(index);
92 }
93
94 List<int> newList = new List<int>();
95 for (int i = currentList.Count - 1; i >= 0; i--)
96 {
97 newList.Add(currentList[i]);
98 }
99
100 return newList;
101 }
102 /**//// <summary>
103 /// 创建长度为count的随机索引
104 /// </summary>
105 /// <param name="count">长度</param>
106 /// <returns></returns>
107 public List<int> GetRandomIndex(int count)
108 {
109 List<int> randomList = new List<int>();
110 for (int i = 0; i < count; i++)
111 {
112 randomList.Add(i);
113 }
114 return GetRandomIndex(randomList);
115 }
116 }
1/**//// <summary>
2 /// 随机索引生成类
3 /// </summary>
4 /// <example>
5 /// private static List(int) showList = new List(int)(); //定义静态索引
6 /// //调用索引
7 /// if (showList.Count < 50)
8 /// showList = MyLibrary.SimpleFunction.RandomFunction.RandomIndex.Run().GetRandomIndex(50);
9 /// else
10 /// showList = MyLibrary.SimpleFunction.RandomFunction.RandomIndex.Run().GetRandomIndex(showList);
11 /// foreach (int i in showList)
12 /// Response.Write(i + ",");
13 /// </example>
14 public class RandomIndex
15 {
16 Random rnd = new Random();
17 private static List<int> indexList = new List<int>();
18
19 private static RandomIndex randomIndex;
20 private RandomIndex(int length)
21 {
22 for (int i = 0; i < length; i++)
23 indexList.Add(i);
24 }
25 /**//// <summary>
26 /// 静态调用方法
27 /// </summary>
28 /// <param name="length">索引长度</param>
29 /// <returns></returns>
30 public static RandomIndex Run(int length)
31 {
32 if (randomIndex == null) randomIndex = new RandomIndex(length);
33 return randomIndex;
34 }
35
36 /**//// <summary>
37 /// 生成随机索引,从0开始,到length-1
38 /// 必须使用有参构造方法
39 /// </summary>
40 /// <returns></returns>
41 public List<int> GetRandomIndex()
42 {
43 int randomNumber = rnd.Next(1000, 2000);
44 Random r = new Random(unchecked((int)DateTime.Now.Ticks));
45
46 for (int i = 0; i < randomNumber; i++)
47 {
48 int index = r.Next(0, indexList.Count);
49 if (indexList.Remove(index))
50 indexList.Add(index);
51 }
52 List<int> newList = new List<int>();
53 for (int i = indexList.Count - 1; i >= 0; i--)
54 {
55 newList.Add(indexList[i]);
56 }
57
58 return newList;
59 }
60
61 //--------↑使用静态方法生成随机索引---------------------------//
62 //--------↓静态索引定义在调用类中,此处只提供生成--------------//
63
64 private RandomIndex() { }
65 /**//// <summary>
66 /// 静态调用方法
67 /// </summary>
68 /// <returns></returns>
69 public static RandomIndex Run()
70 {
71 if (randomIndex == null)
72 randomIndex = new RandomIndex();
73 return randomIndex;
74 }
75 /**//// <summary>
76 /// 对现有索引表进行随机排序
77 /// 修正了多次调用导致长度无法统一问题
78 /// currentList可由调用的类来控制长度
79 /// </summary>
80 /// <param name="currentList"></param>
81 /// <returns></returns>
82 public List<int> GetRandomIndex(List<int> currentList)
83 {
84 int randomNumber = rnd.Next(1000, 2000);
85 Random r = new Random(unchecked((int)DateTime.Now.Ticks));
86
87 for (int i = 0; i < randomNumber; i++)
88 {
89 int index = r.Next(0, currentList.Count);
90 if (currentList.Remove(index))
91 currentList.Add(index);
92 }
93
94 List<int> newList = new List<int>();
95 for (int i = currentList.Count - 1; i >= 0; i--)
96 {
97 newList.Add(currentList[i]);
98 }
99
100 return newList;
101 }
102 /**//// <summary>
103 /// 创建长度为count的随机索引
104 /// </summary>
105 /// <param name="count">长度</param>
106 /// <returns></returns>
107 public List<int> GetRandomIndex(int count)
108 {
109 List<int> randomList = new List<int>();
110 for (int i = 0; i < count; i++)
111 {
112 randomList.Add(i);
113 }
114 return GetRandomIndex(randomList);
115 }
116 }
采用单例模式,这样随着索引列表调用次数越多,列表越随机(0.0)