2012-03-14 4 views

答えて

10

いいえ、組み込みメソッドはありません。あなたは常にリストについて

int maxIndex = myList.Count - 1; 

を使用することができ、あなたは、要素が範囲0..Count-1になることが保証されているので、あなたは、拡張メソッドを作成することができますもちろんオフ

public static int LastIndex<T>(this List<T> list) 
{ 
    return list.Count-1; 
} 

をリストに0個の要素がある場合、これらの行は-1を返します。これは問題の可能性があります。

+0

これは私が欲しくないことです。 -1を書かずにこれを実現するメソッドがあるかどうか疑問に思っていました。(私も拡張メソッドを書くこともできますが、そこにメソッドがありますか?) – pencilCake

+0

@pencilCake:拡張メソッドを編集して含めました。 – SWeko

+0

@pencilCake、SWekoは*メソッドが組み込まれていないと述べています。したがって、 "-1"を使用するか、拡張メソッドを作成してください。それらはあなたの選択です:) –

8

最大有効インデックスは常にサイズである - ので、1:

int maxIndex = list.Count - 1; 

あなたは非常に読みやすいように、最後のインデックスでを取得したい場合は、LINQを使用することができます

OBJEにLINQ - これは list[list.Count - 1]を用いとして かなりとして効率的ではないであろうが、それは はO(N)操作されないこと
var item = list.Last(); 

注さまざまな場所で最適化され、IList<T>を活用しています。

+0

もしそうでなければ、それはO(1)であることを意味しますか? – pencilCake

+2

'List'が空であれば' Last() 'を使うときに' InvalidOperationException'をスローします。 – eandersson

+0

@pencilCakeいいえ、そうではありません。 O(log n) – clearpath

0

最大値のインデックスを意味する場合は、いいえ、存在しません。おそらく拡張メソッドを書くことができます:

これらは最小値と最大値です。

static class Tools { 
    public static int IndexOfMin<TSource>(this IEnumerable<TSource> source) where TSource : IComparable<TSource> { 
     int index = -1; 
     int i = -1; 
     TSource min = default(TSource); 

     foreach (var element in source) { 
      i++; 

      if (index == -1 || (min != null && min.CompareTo(element) > 0)) { 
       index = i; 
       min = element; 
      } 
     } 

     return index; 
    } 

    public static int IndexOfMax<TSource>(this IEnumerable<TSource> source) where TSource : IComparable<TSource> { 
     int index = -1; 
     int i = -1; 
     TSource max = default(TSource); 

     foreach (var element in source) { 
      i++; 

      if (index == -1 || (max == null && element != null) || max.CompareTo(element) < 0) { 
       index = i; 
       max = element; 
      } 
     } 

     return index; 
    } 
} 

これらの方法は、nullを最小値と見なします。 nullとの比較は、コンパイラによってnullableではない型に対して無視されます。

関連する問題