web-dev-qa-db-ja.com

特定のエントリのLINQインデックス

MVC3 C#.Net Webアプリがあります。以下の文字列配列があります。

    public static string[] HeaderNamesWbs = new[]
                                       {
                                          WBS_NUMBER,
                                          BOE_TITLE,
                                          SOW_DESCRIPTION,
                                          HARRIS_WIN_THEME,
                                          COST_BOGEY
                                       };

別のループにいるときに、特定のエントリのインデックスを検索したい。リストにはIndexOfがあると思いました。見つかりません。何か案は?

22
MikeTWebb

さてあなたはArray.IndexOfを使うことができます:

int index = Array.IndexOf(HeaderNamesWbs, someValue);

または、代わりにHeaderNamesWbsIList<string>として宣言します。必要に応じて、配列にすることもできます。

public static IList<string> HeaderNamesWbs = new[] { ... };

配列をpublic static、_public static readonlyとして公開することはお勧めしません。 ReadOnlyCollectionを検討する必要があります:

public static readonly ReadOnlyCollection<string> HeaderNamesWbs =
    new List<string> { ... }.AsReadOnly();

IEnumerable<T>にこれが必要な場合は、次のように使用できます。

var indexOf = collection.Select((value, index) => new { value, index })
                        .Where(pair => pair.value == targetValue)
                        .Select(pair => pair.index + 1)
                        .FirstOrDefault() - 1;

(+1と-1は、「欠落」に対して0ではなく-1を返すようにするためです。)

50
Jon Skeet

ここのスレッドに遅れました。しかし、私はこれに対する私の解決策を共有したいと思いました。 Jonは素晴らしいですが、私はすべてに対して単純なラムダを好みます。

LINQ自体を拡張して、必要なものを取得できます。それを行うのはかなり簡単です。これにより、次のような構文を使用できます。

// Gets the index of the customer with the Id of 16.
var index = Customers.IndexOf(cust => cust.Id == 16);

これは列挙を必要とするため、デフォルトではLINQの一部ではない可能性があります。それは単に別の遅延セレクター/述語ではありません。

また、これは最初のインデックスのみを返すことに注意してください。インデックス(複数)が必要な場合は、メソッド内でIEnumerable<int>およびyeild return indexを返す必要があります。そしてもちろん-1を返しません。これは、主キーでフィルタリングしない場合に役立ちます。

  public static int IndexOf<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate) {

     var index = 0;
     foreach (var item in source) {
        if (predicate.Invoke(item)) {
           return index;
        }
        index++;
     }

     return -1;
  }
17
Paul

正しいListにはIndexOf()があり、ILIst<string>ではなくstring[]として宣言するだけです。

public static IList<string> HeaderNamesWbs = new List<string>
                                   {
                                      WBS_NUMBER,
                                      BOE_TITLE,
                                      SOW_DESCRIPTION,
                                      HARRIS_WIN_THEME,
                                      COST_BOGEY
                                   };

int index = HeaderNamesWbs.IndexOf(WBS_NUMBER);

MSDN: List(Of T).IndexOfメソッド(T)

6
sll

アイテム値を指定するのではなく関数でリストを検索する場合は、List.FindIndex(述語一致)を使用できます。

https://msdn.Microsoft.com/en-us/library/x1xzf2ca%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396 を参照してください

4
Shiv