web-dev-qa-db-ja.com

最大年齢を選択C#

次のプロパティを持つオブジェクトのコレクションを含む_list<T>_を作成しました:XYZ

コレクション内のどのオブジェクトが最も大きいかを知りたいZ

Max()関数を使用しようとしましたが、それがどのように使用されるのかわかりません...

17
Killercode

Maxは、プロパティの最大値を見つけるために使用されます。最大値を取得したら、Where句を使用して、値が一致するオブジェクトを選択できます。

var maxZ = list.Max( obj => obj.Z );
var maxObj = list.Where( obj => obj.Z == maxZ );
33
tvanfosson

最大のZ値を持つオブジェクトを取得するには、Z値で降順に並べ替え、最初の項目を取得します。

TypeOfObject oldest = list.OrderByDescending(x => x.Z).First();

編集:
List.Sortの代わりにIEnumerable.OrderByDescendingメソッドを使用するように変更しました。

編集2:
パフォーマンスが必要な場合、これは最速のLINQソリューションよりも約4倍高速です。

int high = Int32.MinValue;
List<TypeOfObject> highest = new List<TypeOfObject>();
foreach (TypeOfObject v in list) {
   if (v.Z >= high) {
      if (v.Z > high) highest.Clear();
      high = v.Z;
      highest.Add(v);
   }
}
19
Guffa
int maxAge = myList.Max(obj => obj.Z);

使用されるパラメーターはラムダ式です。この式は、最大値を取得するために使用するプロパティ(この場合はZ)を示します。これは最大年齢を取得します。最も古い年齢のオブジェクトが必要な場合は、年齢で並べ替えて、最初の結果を取得できます。

MyType maxItem = myList.OrderByDescending(obj => obj.Z).First();

この方法で行う場合、2つ以上のアイテムがすべて最大経過時間を持っている場合、そのうちの1つだけが選択されることに注意してください。

7
Meta-Knight

どちらかを実装できる場合IComparable<T>またはIComparableをクラスで次のように記述します。

public Int32 CompareTo(MyClass other) {
  return Z.CompareTo(other.Z);
}

呼び出すだけで最大値を取得できます(これにはusing System.Linq):

MyClass maxObject = list.Max();

これは、値のリストに対して単一のパスのみを実行します。

1

比較できる場合、Xのタイプに大きく依存します。

var array = new[] { 
    new { X = "a", Y = "a", Z = 1 }, 
    new { X = "b", Y = "b", Z = 2 } 
};
var max = array.Max(x => x.Z);
Console.WriteLine(max);
0
Darin Dimitrov