首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >洗牌Stack<T>

洗牌Stack<T>
EN

Stack Overflow用户
提问于 2015-11-11 02:06:26
回答 2查看 6.1K关注 0票数 2
代码语言:javascript
运行
复制
    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 Shu显扩展方法可以工作,但是Stack Shu显并不能按预期工作。就好像中间的洗牌呼叫根本没有被调用一样。相反,它仍然是一样的,没有洗牌。所以我假设问题在ToStack函数中。有人能解释一下我的错误吗?提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-11 02:33:34

问题是要将Stack<T>的新实例分配给局部变量,这意味着调用堆栈变量不会更改。

现在您可以向参数中添加一个ref,但我通常尽量避免这样做。

这里有两种选择。

如果您想继续使用相同的引用,那么可以这样做:

代码语言:javascript
运行
复制
public static void Shuffle<T>(this Stack<T> stack)
{
    var values = stack.ToArray();
    stack.Clear();
    foreach (var value in values.OrderBy(x => rnd.Next()))
        stack.Push(value);
}

这相当简单,并且避免了调用单独的方法来洗牌的需要。

或者,您可以返回Stack<T>的一个新实例。

代码语言:javascript
运行
复制
public static Stack<T> Shuffle<T>(this Stack<T> stack)
{
    return new Stack<T>(stack.OrderBy(x => rnd.Next()));
}

这再次避免了调用单独的洗牌方法的需要。

这两种方法都使用.OrderBy(x => rnd.Next())来执行洗牌,这比在周围交换索引容易得多。

票数 4
EN

Stack Overflow用户

发布于 2015-11-11 02:14:02

Shuffle方法(接受Stack<T>)按值接受堆栈参数。因此,当您调用stack = list.ToStack ();时,您正在更改该方法的本地变量(stack)。

一种解决方案是像对List<T>洗牌方法所做的那样:

代码语言:javascript
运行
复制
public static Stack<T> Shuffle<T>(this Stack<T> stack)
{
    List<T> list = stack.ToList();
    list.Shuffle();
    return list.ToStack();
}

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

代码语言:javascript
运行
复制
Stack<int> stack = new Stack<int>();
for(int i = 0 ; i < 10 ; i++)
    stack.Push(i);

stack = stack.Shuffle();
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33643104

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档