Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将一个堆栈推到另一个堆栈上_C#_.net_Stack - Fatal编程技术网

C# 将一个堆栈推到另一个堆栈上

C# 将一个堆栈推到另一个堆栈上,c#,.net,stack,C#,.net,Stack,在C#中,有没有一种方法可以将一个堆栈推到另一个堆栈上,而无需迭代堆栈元素?如果没有,我是否应该使用更好的数据结构?在Java中,您可以执行以下操作: stack1.addAll(stack2) 我希望找到C#模拟…一个addAll对于一个foreach循环来说是一个方便的方法,可以添加所有的项。除此之外,你真的没什么可做的了: foreach(var item in stack2) stack1.Push(item); 如果您特别频繁地执行此操作,您可以为其添加扩展方法,以方便您自

在C#中,有没有一种方法可以将一个堆栈推到另一个堆栈上,而无需迭代堆栈元素?如果没有,我是否应该使用更好的数据结构?在Java中,您可以执行以下操作:

stack1.addAll(stack2)

我希望找到C#模拟…

一个
addAll
对于一个
foreach
循环来说是一个方便的方法,可以添加所有的项。除此之外,你真的没什么可做的了:

foreach(var item in stack2)
    stack1.Push(item);

如果您特别频繁地执行此操作,您可以为其添加扩展方法,以方便您自己。

0。安全解决方案-扩展方法

public static class Util {
        public static void AddAll<T>(this Stack<T> stack1, Stack<T> stack2) {
            T[] arr = new T[stack2.Count];
            stack2.CopyTo(arr, 0);

            for (int i = arr.Length - 1; i >= 0; i--) {
                stack1.Push(arr[i]);
            }
        }
    }

在您的问题中,想要做到这一点“而不迭代堆栈元素”基本上意味着一个基于
LinkedList
的堆栈,您只需将第一个和最后一个元素连接起来,以恒定的时间组合堆栈

但是,除非您使用
LinkedList
有非常具体的原因,否则最好只迭代基于数组(
List
)的堆栈元素


对于特定的实现,您可能应该澄清是希望第二个堆栈以相同的堆栈顺序添加到第一个堆栈中,还是希望通过弹出将第二个堆栈反转到第一个堆栈中。

这并不意味着要使用当前的.NET堆栈实现来完成

为了将堆栈的内容“嫁接”到另一个堆栈的末尾,而不迭代其元素,必须知道堆栈类如何将其存储在内存中的内部实现细节。基于封装原理,此信息“正式”仅在堆栈类内部知道。NET的堆栈不公开方法来执行此操作,因此如果不使用反射,就无法按照OP的请求执行此操作

可以想象,您可以使用反射将另一个堆栈的内容附加到一个堆栈的内部数组,并更新存储堆栈长度的字段,但这在很大程度上取决于堆栈类的实现,该类可以在框架的未来版本中更改,而无需发出警告


如果你真的需要一个能做到这一点的堆栈,你可以从头开始编写你自己的堆栈类,或者简单地使用另一个集合,比如
ArrayList
LinkedList
,它们有你想要的方法,并向它们添加
Push
Pop
扩展方法。

Parhaps有点迟钝,但是强制转换到
ArrayList
然后使用,然后强制转换回堆栈?重复?可以将每个堆栈复制到数组中,然后使用数组。复制合并数组,然后将数组加载到ctor中的新堆栈中,但我想我只是循环一下。哇,这是一个非常大的提示@rdodev,列表中似乎还有InsertRange()方法,这与我想要的方法很接近,还有AddRange(),这正是我想要的。如果AddRange如我所期望的那样工作,我会给你答案点…@ryan0很好,让我知道这是否是适合你的解决方案。奇怪的是,没有明确指定堆栈的枚举顺序,尽管它确实有一个示例。不过,
ToArray
方法确实指定了后进先出顺序。我喜欢你的安全解决方案。这正是我想要的行为,同时仍然使用堆栈(当你做类似堆栈的事情时,它们在概念上更好)。是的,我现在看到那些AddRange/AddAll方法都进行迭代。我想我是在追求方便,而不是真正的表现。
  Stack<int> x = new Stack<int>();
  x.Push(1);
  x.Push(2);

  Stack<int> y = new Stack<int>();
  y.Push(3);
  y.Push(4);          

  x.AddAll(y);
y.Reverse().ToList().ForEach(item => x.Push(item));