web-dev-qa-db-ja.com

List <myType>から最大値を取得

リストがありますList<MyType>、私のタイプにはAgeRandomIDが含まれます

今、私はこのリストから最大年齢を見つけたいです。

最も簡単で効率的な方法は何ですか?

51
Waheed

さて、LINQがない場合は、ハードコーディングできます。

public int FindMaxAge(List<MyType> list)
{
    if (list.Count == 0)
    {
        throw new InvalidOperationException("Empty list");
    }
    int maxAge = int.MinValue;
    foreach (MyType type in list)
    {
        if (type.Age > maxAge)
        {
            maxAge = type.Age;
        }
    }
    return maxAge;
}

または、多くのリストタイプで再利用可能な、より一般的なバージョンを作成することもできます。

public int FindMaxValue<T>(List<T> list, Converter<T, int> projection)
{
    if (list.Count == 0)
    {
        throw new InvalidOperationException("Empty list");
    }
    int maxValue = int.MinValue;
    foreach (T item in list)
    {
        int value = projection(item);
        if (value > maxValue)
        {
            maxValue = value;
        }
    }
    return maxValue;
}

これは以下で使用できます。

// C# 2
int maxAge = FindMax(list, delegate(MyType x) { return x.Age; });

// C# 3
int maxAge = FindMax(list, x => x.Age);

または、 LINQBridge :)を使用できます

いずれの場合も、必要に応じてMath.Maxへの単純な呼び出しでifブロックを返すことができます。例えば:

foreach (T item in list)
{
    maxValue = Math.Max(maxValue, projection(item));
}
34
Jon Skeet

LINQへのアクセス権があり、Ageintであると仮定します(var maxAgeを試すこともできます-コンパイルする可能性が高くなります)。

int maxAge = myTypes.Max(t => t.Age);

RandomID(またはオブジェクト全体)も必要な場合、簡単な解決策は MaxBy from MoreLinq を使用することです

MyType oldest = myTypes.MaxBy(t => t.Age);
83
Kobi
31
anishMarokey
thelist.Max(e => e.age);
8
thelost
var maxAge = list.Max(x => x.Age);
5
ch007

この方法はどうですか:

_List<int> myList = new List<int>(){1, 2, 3, 4}; //or any other type
myList.Sort();
int greatestValue = myList[ myList.Count - 1 ];
_

基本的に、独自のメソッドを記述する代わりに、Sort()メソッドにジョブを実行させます。コレクションをソートしたくない場合を除きます。

1
Behnam Rasooli

最も簡単な方法は、前述のようにSystem.Linqを使用することです

using System.Linq;

public int GetHighestValue(List<MyTypes> list)
{
    return list.Count > 0 ? list.Max(t => t.Age) : 0; //could also return -1
}

これは辞書でも可能です

using System.Linq;

public int GetHighestValue(Dictionary<MyTypes, OtherType> obj)
{
    return obj.Count > 0 ? obj.Max(t => t.Key.Age) : 0; //could also return -1
}
0
Jason Newland