unityのc#でLinqExtra
のShuffle
で大ハマリしました。
同じListをforeachしてるのに毎回並びが違うというものです。
@monryさんが書いてくれた検証コードがコレ。
コード:
IEnumerable<int> list = new List<int> {1, 2, 3};
Debug.Log("--A--");
list.ToList().ForEach(x => Debug.Log(x));
list = list.Shuffle();
Debug.Log("--B--");
list.ToList().ForEach(x => Debug.Log(x));
Debug.Log("--C--");
list.ToList().ForEach(x => Debug.Log(x));
Debug.Log("--D--");
list.ToList().ForEach(x => Debug.Log(x));
結果:
--A--
1
2
3
--B--
3
2
1
--C--
2
3
1
--D--
2
1
3
なんでB, C, Dが違うわけ?
@monryさんに聞いてソースを見たところ原因は結果、
「Shuffle
という拡張メソッドはShuffleIterator
という別のIteratorを返すから」
というものでした。
list = list.Shuffle();
のところでIteratorが変わっちゃってるんですね。
データとイテレータは分かれているのだと仕組みとしては知っていても、あまり活用したり意識したりすることがなかったので盲点でした。
list = list.Shuffle().ToList();
こうやって上品な抽象的なところから汚くて臭い具象に落としてやればOK。