2009-06-23 7 views
10

私は次のようなコレクションを持っており、コレクション内で最も高い整数を見つける必要があります。それは任意の数の整数を持つことができ、私は同じ整数値を複数回持つことができます。C#を使用して汎用リストの中で最大の整数を見つける?

List<int> MyList = new List<int> { 3, 4, 6, 7, 9, 3, 4, 5, 5 }; 

最も高い整数を見つけるのに最も簡単なアルゴリズムは何ですか?私はC#と.NET 3.5フレームワークを使用しています。

+7

無制限?それは多くの整数です。 – Hardwareguy

+0

私はこれがトリック質問だと信じています。 – Groo

+0

@Groo - トリック質問ではありません。 –

答えて

68

あなたはただ行うことができます。

int max = MyList.Max(); 

は詳細についてはEnumerable.Maxを参照してください。

+14

をSystem.Linqを使用して追加してください。 としてMaxが拡張メソッドです。 – aquinas

6

Enumerableにはこれを行うMax関数があります。

Reflectorを使用して整数methodの実装を調べると、このメソッドはIEnumerableソース内の各要素をループし、以前に最高値であったものと比較します。

9

最大値を頻繁に取得する必要がある場合は、最大アイテムをキャッシュに保持する独自のリストクラスを作成する(またはリストから派生させる)ことも考えられます。このようなクラスは次のようになります。また

public class MaxList<T> : IList<T>, ICollection<T>, IEnumerable<T> 
{ 
    T Maximum { get; set; } 
    List<T> _list; 

    public T this[int index] { get; set; } 

    public void Add(T item) 
    { 
     if (item > this.Maximum) 
     { 
      this.Maximum = item; 
     } 
     _list.Add(item); 
    } 

    // ... IEnumerable<T>, ICollection<T> and IList<T> members 

} 

、あなたは直接リストから派生し、追加と削除メソッドを上書き(基本的にすべてのメソッドは、リストの項目を変更)し、それに応じてキャッシュを更新することができます。

このようなアプローチが本当に効果があるかどうかは、シナリオによって異なります。あなたが非常に大きなリストを持っていて、めったに更新されず、頻繁に最大値を取得する必要がある場合、ITは間違いなくです。そうでなければ、すでに提案されている解決法ははるかに簡単であるため、

+3

最大値が現在有効かどうかを示す状態が必要です。最大値に等しい項目が削除された場合は、無効にする必要があります。この場合、getメソッドは新しい最大のためにリストを再スキャンする必要があります(おそらくMax拡張メソッドを使用します)。ソートされたリストを使用することもできますが、それに関連する他の価格もあります。 – Brian

+0

はい、あなたは正しいです。私は怠け者であり、キャッシュを無効にする必要があるremoveメソッドとインデクサーを削除しただけで、sceletonクラスを提供しました。私はまた、Enumberable.Maxを使用している可能性のあるキャッシュを再計算する方法を廃止しました。 –

1

genericlist.Remove(genericlist.Max)

関連する問題