いつもお世話になっております。
昨日家でコードを書いていて遭遇した問題と疑問点を質問させていただきたく思います。
前提
自宅ではVisual Studio 2019 Community Edition
Visual Studio 2017 Community Edition Version 15.5.7
仕事場ではVisual Studio 2013 Professional Edition
を利用しています。
それぞれ 2017の環境、2013の環境と呼称することとします。
該当のソースコード
コンソールプロジェクトを作成して以下のコードを実行します。
0~99の値をシャッフルして1行ごとに表示するといった、とてもシンプルなコードです。
C#
1using System; 2using System.Linq; 3 4namespace ConsoleApplication1 5{ 6 class Program 7 { 8 static void Main(string[] args) 9 { 10 var order = Enumerable.Range(0, 100).OrderBy(x => Guid.NewGuid()); 11 Console.WriteLine(string.Join("\r\n", order)); 12 } 13 } 14} 15
発生した現象
2013の環境で実行した結果
text
14 27 311 49 58 6...以下略
100行表示され、各行の値が重複なくシャッフルされた状態で表示されました。
続いて
2017の環境で実行した結果
text
197 21 30 41 527 6...以下略
100行表示されますが、各行の値が一部重複し、欠番が発生しています。
2013の結果が偶然の可能性もあったため、100回程試しましたが、重複はありませんでした。
また、重複する値や個数は決まっているわけではなく毎回異なります。
問題を回避した方法
試しに以下のコードに変更して実験してみました。
C#
1// var order = Enumerable.Range(0, 100).OrderBy(x => Guid.NewGuid()); 2var order = Enumerable.Range(0, 100).ToList().OrderBy(x => Guid.NewGuid());
上記に変更した結果として、2013でも2017でも実行結果は
100行表示され、各行の値が重複なくシャッフルされた状態で表示されました。
疑問点
2013~2017の間で上記のようにIEnumerableに対してOrderByを書いた場合の動作が変わったのでしょうか?
それとも、自分の環境でしか起こらない現象なのでしょうか?
フレームワークのバージョン
2017 → .Net Core 2.0
2013 → .NetFrameWork 4.5
デバッグモードでの表示
追記依頼の部分でtamoto様からお聞きした情報からもう一度デバッグを行ってみました。
C#
1var order = Enumerable.Range(0, 100).OrderBy(x => Guid.NewGuid());
こちらのorderの中身を覗いてみると以下のようになりました。
コメントに画像が挿入できないためこちらに記載させていただきました。


回答2件
あなたの回答
tips
プレビュー