LINQ indexOf конкретной записи - PullRequest
18 голосов
/ 15 февраля 2012

У меня есть веб-приложение MVC3 C # .Net. У меня есть массив строк ниже.

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

Я хочу найти индекс данной записи в другом цикле. Я думал, что список будет иметь IndexOf. Я не могу найти это. Есть идеи?

Ответы [ 4 ]

45 голосов
/ 15 февраля 2012

Ну, вы можете использовать Array.IndexOf:

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

Или просто объявить HeaderNamesWbs как IList<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 так, что этовернет -1 для «отсутствующих», а не 0.)

14 голосов
/ 30 апреля 2015

Я опоздал к теме здесь. Но я хотел поделиться своим решением этого. Jon's потрясающий, но я предпочитаю простые лямбды для всего.

Вы можете расширить сам 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;
  }
5 голосов
/ 15 февраля 2012

Право 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: Список (Of T). Индекс Метод (T)

1 голос
/ 07 марта 2018

Если вы хотите выполнять поиск в List с помощью функции, а не указывать значение элемента, вы можете использовать List.FindIndex (Predicate match).

См. https://msdn.microsoft.com/en-us/library/x1xzf2ca%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396

...