当时写这个类是因为商务那边需要页面内容随机显示,但是数据是以泛型的形式放在缓存中,所以没可能每次用户刷新页面均访问数据库,所以,对泛型的随机排序需求应运而生.我采用了随机生成索引列表,然后根据索引列表来获取泛型中数据来实现随机.随机索引列表使用抽牌形式进行,避免了random函数的一些问题...
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
/// else10
/// showList = MyLibrary.SimpleFunction.RandomFunction.RandomIndex.Run().GetRandomIndex(showList);11
/// foreach (int i in showList)12
/// Response.Write(i + ",");13
/// </example>14
public class RandomIndex15

{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-138
/// 必须使用有参构造方法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)