2014-12-09 5 views
2

Я пытаюсь искать индекса из элемента списка первый , который имеет значение «привет» и это индекс выше . Это, очевидно, не так, потому что, когда я имею в виду р, я имею в виду значения , а не строки сам (IndexOf просматривает индекс первого вхождения «привет» в списке , потому что р == строки)Поиск по индексу?

int soucasny = list1.FindIndex(p => p == "hello" || list1.IndexOf(p) > 15); 

есть ли способ, чтобы достичь желаемого результата? Выберите, возможно?

ответ

9

Вы можете указать начальный индекс для IndexOf

int soucasny = list1.IndexOf("hello", 15); 
+1

I Думаю, это не сработает, нет? Поскольку объект внутри списка не совпадает с константой, которую вы передаете, нет? – Jauch

+0

О да, будет. Я думаю так. Тестирование сейчас. – HajdaCZ

+0

@Jauch, насколько List is 'List ' это должно работать. \ – Habib

2

Используйте List<T>.FindIndex Method (Int32, Predicate<T>), который принимает предикат и определяет индекс для начала поиска, как:

int soucasny = list1.FindIndex(15, p => p == "hello"); 

Если у вас есть List<string> то с помощью List<T>.IndexOf бы дать вы результат, но если у вас есть список пользовательских объектов, то вам может понадобиться предикат. Нравится:

List<Student> studentList = new List<Student>(); 
int index = studentList.FindIndex(15, p=> p.StudentName == "Some Name"); 
1

@ Selman22 обеспечивает наиболее правильный и эффективный ответ для вашего точного вопроса. Я предлагаю следующее лишь в качестве дополнения, за исключением случаев, когда вы можете иметь не- List последовательности или необходим доступ к индексировать элемент из вашего выражения фильтра: Использование

public static int FirstIndexWhere<T>(
    this IEnumerable<T> sequence, 
    Func<T, int, bool> predicate) 
{ 
    if (sequence == null) 
     throw new ArgumentNullException("sequence"); 
    if (predicate == null) 
     throw new ArgumentNullException("predicate"); 

    var index = 0; 

    for (var enumerator = sequence.GetEnumerator(); enumerator.MoveNext(); ++index) 
    { 
     if (predicate(enumerator.Current, index)) 
      return index; 
    } 

    return -1; 
} 

Примера:

int soucasny = list1.FirstIndexWhere((p, i) => p == "hello" && i > 15);