【发布时间】:2015-11-11 02:06:26
【问题描述】:
public static void Shuffle<T> ( this Stack<T> stack )
{
List<T> list = stack.ToList ();
list.Shuffle ();
stack = list.ToStack ();
}
public static void Shuffle<T> ( this List<T> list )
{
for ( int i = 0; i < list.Count; i++ )
{
int num = Form1.rnd.Next ( list.Count );
T temp = list[i];
list[i] = list[num];
list[num] = temp;
}
}
public static Stack<T> ToStack<T> ( this List<T> list )
{
Stack<T> stack = new Stack<T> ();
foreach ( T t in list )
stack.Push ( t );
return stack;
}
以上是我对通用堆栈进行洗牌的尝试。然而,虽然 List Shuffle 扩展方法有效,但 Stack Shuffle 并没有按预期工作。就好像根本没有调用中间的 Shuffle 调用。相反,它保持相同的列表,未打乱。所以我认为问题出在 ToStack 函数中。有人可以解释我的错误吗?提前致谢!
【问题讨论】:
-
参数类型不应该是
ref或out以让调用者看到您对输入stack参数的更改吗? -
还有 Nick,如果您在循环开始时创建一个新的 random 实例
var rnd = new Random()然后int num = rnd.Next ( list.Count );,您将能够摆脱对 Form1 的依赖并使用这些方法任何地方。 -
@ray,您不能在扩展方法的第一个参数上使用
ref或out。如果他想使用ref或out,OP 必须将这些方法转换为普通方法。 -
@YacoubMassad:感谢您的澄清。阅读更多关于扩展方法的内容,因为我没有使用它们,而且开头的
this对我来说很奇怪。
标签: c# list generics stack shuffle