投稿者 魔界の仮面弁士  (社会人) 投稿日時 2012/1/19 11:39:24
少し補足。というか訂正です。

先に提示した
Dim list1() As Class1 = data.Where(Function(x) x.A = data.Max(Function(y) y.A)).ToArray()
Dim list2() As Class1 = (From x In data Where x.A = Aggregate y In data Into Max(y.A)).ToArray()
の方式は、処理効率がかなり悪いので避けた方がよさそうです。

これは上記のパイプライン処理が、最大値を何度も算出させてしまうためであり、いわば
Dim list3 As New List(Of Class1)()
For Each x In data
 If x.A = GetMax(data) Then  '最大値の取得 
  list3.Add( x )
 End If
Next
に相当する処理が実行されてしまうためです。

この場合、元のデータ件数が n 個あったとすれば、上記の処理によって
プロパティA が「n×(n+1)回」も走査されることになります。
5件あったら30回ですし、1000件あったら百万回以上です。


最大値の取得は一回だけ行われれば十分なため、これを
Dim list4 As New List(Of Class1)()
Dim maxValue As Integer = GetMax(data)  '最大値の取得 
For Each x In data
 If x.A = maxValue Then
  list3.Add( x )
 End If
Next

のように処理すれば、走査回数を「n×2回」にまで減らすことができます。
5件で10回ですし、1000件でも2000回で済みます。


これに相当する Linq は、たとえばこんな感じで書けます。(2 行になってしまいますが…)
Dim maxValue As Integer = (From x In data Select x.A).Max()
Dim list5() As Class1 = data.Where(Function(x) x.A = maxValue).ToArray()
Dim list6() As Class1 = (From x In data Where x.A = maxValue).ToArray()


# 1 行で済ませられないかな…。