6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[C#] Stackを複製する時の罠

Last updated at Posted at 2018-04-30

C# でコピーコンストラクタを書いてて、 Stack の複製の落とし穴に嵌ったのでメモ。

下記のコード、一見何も問題ないように思いますよね? 

Stack<T> CopyStack<T>(Stack<T> from){
   return new Stack<T>(from);
}

でも、実はこうすると中身が逆順になってしまうんです。
fromの中身が [1,2,3] だと、複製したスタックは [3,2,1]になっちゃいます。

正しく複製するには、引数を逆転させないといけなかった。

Stack<T> CopyStack<T>(Stack<T> from){
   return new Stack<T>(from.Reverse());
}

Stack のコンストラクタに Stack を渡すと IEnumerable に変換されますが、
この時の変換処理は、順次 Pop して取り出していく実装になってます。
ところが、コンストラクタでは IEnumerable から取り出した順に Push していく実装になってます。
このミスマッチによって中身の逆転した Stack が生成されてしまうようです。

[1,2,3] >> []
[1,2] >> [3]
[1] >> [3,2]
[] >> [3,2,1]

6
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?