シーケンスを繰り返すこの機能があります:
public static List<T> Repeat<T>(this IEnumerable<T> lst, int count)
{
if (count < 0)
throw new ArgumentOutOfRangeException("count");
var ret = Enumerable.Empty<T>();
for (var i = 0; i < count; i++)
ret = ret.Concat(lst);
return ret.ToList();
}
今私がする場合:
var d = Enumerable.Range(1, 100);
var f = d.Select(t => new Person()).Repeat(10);
int i = f.Distinct().Count();
私は100になると思っi
ていますが、1000になっています!私の質問は厳密には、なぜこれが起こっているのですか? Linq は、 variable と連結する必要がある最初に選択された 100 人であることを理解するのに十分なほど賢くあるべきではありませんret
か? ここで..で実行されConcat
たときに で使用されると、Select
ret.ToList()
編集:
これを行うと、期待どおりに正しい結果が得られます。
var f = d.Select(t => new Person()).ToList().Repeat(10);
int i = f.Distinct().Count(); //prints 100
もう一度編集します。
オーバーライドしていませんEquals
。私は100人のユニークな人物を取得しようとしています(もちろん参照による)。私の質問は、なぜLinqが最初に選択操作を実行してから連結を実行しないのか(もちろん実行時に)、誰かが私に説明できるでしょうか?