var multiples = from i in Enumerable.Range(min, (max - min))
from r in roots
where i % r == 0
select i;
たとえば、2 回roots = {2,10}
選択するとします。20
ここで重複を避けることは可能ですか?
個別の使用
var multiples = (from i in Enumerable.Range(min, (max - min))
from r in roots
where i % r == 0
select i).Distinct();
string
これは、 や などの単純なタイプでうまく機能しますint
。匿名型ではあまりうまくいきません。
あなたの場合、i
は であるint
ため、重複を整理することができるはずです。
編集
実際、匿名型で機能します(Jeppe のコメントを参照)。@Jeppeが言ったように、匿名型には、toオブジェクトが等しい/重複しているかどうかを決定する「良い」Equals
ことができるからです。Distict
Any()
完全なデカルト結合の代わりに使用できます。
var multiples = from i in Enumerable.Range(min, (max - min))
where roots.Any(r => i % r == 0)
select i;
これには、成功した要素が見つかるとすぐに要素のテストを停止するという追加の利点がroots
あり、個別の要素を引き出すために 2 回目のパススルーを必要としません。
DISTINCTを使用する
var multiples = (from i in Enumerable.Range(min, (max - min))
from r in roots
where i % r == 0
select i).Distinct();
Distinct()
メソッドを使用してください
var multiples = (from i in Enumerable.Range(min, (max - min))
from r in roots
where i % r == 0
select i).Distinct();