c# - 洗牌堆栈<T>

标签 c# list generics stack shuffle

    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 函数中。有人可以解释我的错误吗?提前致谢!

最佳答案

Shuffle方法(采用 Stack<T> )按值采用堆栈参数。所以当你调用 stack = list.ToStack (); ,您正在更改方法本地的变量 ( stack)。

一个解决方案是像您对 List<T> 所做的那样像这样的随机播放方法:

public static Stack<T> Shuffle<T>(this Stack<T> stack)
{
    List<T> list = stack.ToList();
    list.Shuffle();
    return list.ToStack();
}

此方法将堆栈作为输入生成一个新的混洗堆栈。你可以像这样使用它:

Stack<int> stack = new Stack<int>();
for(int i = 0 ; i < 10 ; i++)
    stack.Push(i);

stack = stack.Shuffle();

关于c# - 洗牌堆栈<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33643104/

相关文章:

c# - 门面设计模式与紧耦合

c++ - 字符串与指针比较的问题

c++ - 迭代器如何在以下程序中工作

java - 没有 Spring Boot 泛型会失败?

ios - 以关联类型作为属性的协议(protocol)

c# - 计算 PivotItem 的高度?

c# - 如何使用 XDocument 读取 xml 文件?

c# - Task_disconnected_while_still_running

c# - 关于 Enumerable/List 的评估

c# - 我如何从 Func<Object> 转换为 Func<dynamicType> c#