(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

(:3[kanのメモ帳]

Listの順番を反転させる(中身は変えないVerも)【C#】


このエントリーをはてなブックマークに追加

はじめに


以前C#のListの反転については書いたのですが、



ちょっと追加したい内容があったので、今回は書き直し記事的なやつです。


List の反転

前の記事の通り、ListにはReverseという中身の順番を反転させるメソッドがあります。

//リストを作成
List<int> list = new List<int>(){1, 2, 3};

//中身を列挙
foreach (int num in list) {
  print(num);
}

//反転
print("反転");
list.Reverse();

//反転した中身を列挙
foreach (int num in list) {
  print(num);
}
f:id:kan_kikuchi:20191104071420j:plain


ただ、中身の順序はそのままに取得する順番だけ反転させたい場合もあります。

そんな時はforのインディックスを逆順にするのが一番簡単です。

//リストを作成
List<int> list = new List<int>(){1, 2, 3};

//後ろから列挙
for (int i = list.Count - 1; i >= 0; i--) {
  print(list[i]);
}
f:id:kan_kikuchi:20191104072433j:plain


もっとスマートにしたい場合はLINQのReverseを使う方法もありますが、



そのまま使おうとすると、ListのReverseが優先されてしまうため、

AsEnumerableを使って、一旦ListをEnumerable化する必要があります。

//リストを作成
List<int> list = new List<int>(){1, 2, 3};

//後ろから列挙
foreach (var num in list.AsEnumerable().Reverse()) {
  print(num);
}
f:id:kan_kikuchi:20191104072433j:plain


ちなみに外部からAddやRemoveが出来ないようにListのIEnumerableだけを公開している場合には

そのままLINQのReverseが使えるという利点もあったりします。

/// <summary>
/// Listを持ったクラス
/// </summary>
public class ListClass {
  
  //ListのIEnumerable部分だけ公開
  private List<int> _list = new List<int>(){1, 2, 3};
  public IEnumerable<int> List => _list;

}
//Listを持ったクラス作成
var listClass = new ListClass();

//後ろから列挙
foreach (var num in listClass.List.Reverse()) {
  print(num);
}
f:id:kan_kikuchi:20191104072433j:plain