投稿者 魔界の仮面弁士  (社会人) 投稿日時 2012/1/18 18:34:08
> リストのソートをプロパティAの降順で行い、インデックスが0のものを取得
元のコードは、こういう感じだったのでしょうか。

data.Sort(Function(x, y) y.A.CompareTo(x.A))
Dim ret As Class1 = data(0)



> その他の方法もお教え頂けますでしょうか?
たとえば:

Dim ret0 As Class1 = data.DefaultIfEmpty().Aggregate(Function(x, y) If(x.A < y.A, y, x))
Dim ret1 As Class1 = data.OrderByDescending(Function(c) c.A).FirstOrDefault()
Dim ret2 As Class1 = (From c In data Order By c.A Descending).FirstOrDefault()
Dim ret3 As Class1 = data.OrderBy(Function(c) c.A).LastOrDefault()
Dim ret4 As Class1 = (From c In data Order By c.A).LastOrDefault()
Dim ret6 As Class1 = data.Where(Function(x) x.A = data.Max(Function(y) y.A)).FirstOrDefault()
Dim ret7 As Class1 = (From x In data Where x.A = Aggregate y In data Into Max(y.A)).FirstOrDefault()

0 は shu さんのコードに少し手を加えて、
リストが 0 件だった場合に Nothing を返すようにしたものです。

1 は先の私のコードですね。2,4はクエリ構文、1,3 はメソッド構文です。
1と2 は同じ処理です(降順の先頭項目)。
同様に、3と4も同じ処理を意味します(昇順の最終項目。

6と7 も結果は同じですが、処理手順が異なります。こちらは
最大値の調査とクラスの取り出しとで別の工程になっているため、
A が最大となるインスタンスが複数あった場合に、それらすべてを
取り出すような場合に使った方が良いでしょう。たとえばこんな感じです。

'ToArray(あるいはToList)するかどうかはお好みで。 
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()