List<T>.FindIndex Метод

Определение

Выполняет поиск элемента, удовлетворяющего условиям указанного предиката, и возвращает отсчитываемый от нуля индекс первого найденного вхождения в пределах всего списка List<T> или его части. Этот метод возвращает значение -1, если соответствующий условию элемент не найден.

Перегрузки

FindIndex(Int32, Int32, Predicate<T>)

Выполняет поиск элемента, удовлетворяющего условиям указанного предиката, и возвращает отсчитываемый от нуля индекс первого вхождения в диапазоне элементов списка List<T>, начинающемся с заданного индекса и содержащем указанное число элементов.

FindIndex(Predicate<T>)

Выполняет поиск элемента, удовлетворяющего условиям указанного предиката, и возвращает отсчитываемый от нуля индекс первого найденного вхождения в пределах всего списка List<T>.

FindIndex(Int32, Predicate<T>)

Выполняет поиск элемента, удовлетворяющего условиям указанного предиката, и возвращает отсчитываемый от нуля индекс первого вхождения в диапазоне элементов списка List<T>, начиная с заданного индекса и заканчивая последним элементом.

FindIndex(Int32, Int32, Predicate<T>)

Выполняет поиск элемента, удовлетворяющего условиям указанного предиката, и возвращает отсчитываемый от нуля индекс первого вхождения в диапазоне элементов списка List<T>, начинающемся с заданного индекса и содержащем указанное число элементов.

public:
 int FindIndex(int startIndex, int count, Predicate<T> ^ match);
public int FindIndex (int startIndex, int count, Predicate<T> match);
member this.FindIndex : int * int * Predicate<'T> -> int
Public Function FindIndex (startIndex As Integer, count As Integer, match As Predicate(Of T)) As Integer

Параметры

startIndex
Int32

Индекс (с нуля) начальной позиции поиска.

count
Int32

Число элементов в диапазоне, в котором выполняется поиск.

match
Predicate<T>

Делегат Predicate<T>, определяющий условия поиска элемента.

Возвращаемое значение

Int32

Отсчитываемый от нуля индекс первого вхождения элемента, отвечающего условиям предиката match, если такой элемент найден. В противном случае значение –1.

Исключения

match имеет значение null.

startIndex находится вне диапазона допустимых индексов для List<T>.

-или- Значение параметраcount меньше 0.

-или- startIndex и count не указывают допустимый раздел в List<T>.

Примеры

В следующем примере определяется Employee класс с двумя полями Name и Id. Он также определяет EmployeeSearch класс с одним методом, который указывает, StartsWithначинается ли Employee.Name поле с указанной подстроки, предоставляемой конструктору EmployeeSearch класса. Обратите внимание на сигнатуру этого метода.

public bool StartsWith(Employee e)  
Public Function StartsWith(e As Employee) As Boolean  

соответствует сигнатуре делегата, который можно передать методу FindIndex . В примере создается экземпляр List<Employee> объекта, добавляется к нему несколько Employee объектов, а затем метод вызывается FindIndex(Int32, Int32, Predicate<T>) дважды для поиска всей коллекции (то есть членов индекса 0 к индексу Count – 1). При первом поиске Employee первого объекта, поле которого Name начинается с "J"; во второй раз выполняется поиск первого Employee объекта, поле которого Name начинается с "Ju".

using System;
using System.Collections.Generic;

public class Employee : IComparable
{
   public String Name { get; set; }
   public int Id { get; set; }

   public int CompareTo(Object o )
   {
      Employee e = o as Employee;
      if (e == null)
         throw new ArgumentException("o is not an Employee object.");

      return Name.CompareTo(e.Name);
   }
}

public class EmployeeSearch
{
   String _s;

   public EmployeeSearch(String s)
   {
      _s = s;
   }

   public bool StartsWith(Employee e)
   {
      return e.Name.StartsWith(_s, StringComparison.InvariantCultureIgnoreCase);
   }
}

public class Example
{
   public static void Main()
   {
      var employees = new List<Employee>();
      employees.AddRange( new Employee[] { new Employee { Name = "Frank", Id = 2 },
                                           new Employee { Name = "Jill", Id = 3 },
                                           new Employee { Name = "Dave", Id = 5 },
                                           new Employee { Name = "Jack", Id = 8 },
                                           new Employee { Name = "Judith", Id = 12 },
                                           new Employee { Name = "Robert", Id = 14 },
                                           new Employee { Name = "Adam", Id = 1 } } );
      employees.Sort();

      var es = new EmployeeSearch("J");
      Console.WriteLine("'J' starts at index {0}",
                        employees.FindIndex(0, employees.Count - 1, es.StartsWith));

      es = new EmployeeSearch("Ju");
      Console.WriteLine("'Ju' starts at index {0}",
                        employees.FindIndex(0, employees.Count - 1,es.StartsWith));
   }
}
// The example displays the following output:
//       'J' starts at index 3
//       'Ju' starts at index 5
Imports System.Collections.Generic

Public Class Employee : Implements IComparable
   Public Property Name As String
   Public Property Id As Integer
   
   Public Function CompareTo(o As Object) As Integer _
         Implements IComparable.CompareTo
      Dim e As Employee = TryCast(o, Employee)
      If e Is Nothing Then
         Throw New ArgumentException("o is not an Employee object.")
      End If

      Return Name.CompareTo(e.Name)
   End Function
End Class

Public Class EmployeeSearch
   Dim _s As String
   
   Public Sub New(s As String)
      _s = s
   End Sub
   
   Public Function StartsWith(e As Employee) As Boolean
      Return e.Name.StartsWith(_s, StringComparison.InvariantCultureIgnoreCase)
   End Function
End Class

Module Example
   Public Sub Main()
      Dim employees As New List(Of Employee)()
      employees.AddRange( { New Employee() With { .Name = "Frank", .Id = 2 },
                            New Employee() With { .Name = "Jill", .Id = 3 },
                            New Employee() With { .Name = "Dave", .Id = 5 },
                            New Employee() With { .Name = "Jack", .Id = 8 },
                            New Employee() With { .Name = "Judith", .Id = 12 },
                            New Employee() With { .Name = "Robert", .Id = 14 },
                            New Employee() With { .Name = "Adam", .Id = 1 } } )
      employees.Sort()

      Dim es As New EmployeeSearch("J")
      Console.WriteLine("'J' starts at index {0}",
                        employees.FindIndex(0, employees.Count - 1,
                                            AddressOf es.StartsWith))
      es = New EmployeeSearch("Ju")
      Console.WriteLine("'Ju' starts at index {0}",
                        employees.FindIndex(0, employees.Count - 1,
                                            AddressOf es.StartsWith))
   End Sub
End Module
' The example displays the following output:
'       'J' starts at index 3
'       'Ju' starts at index 5

Комментарии

Выполняется List<T> поиск вперед, начиная с startIndex и заканчивая startIndex count плюс минус 1, если count значение больше 0.

Является Predicate<T> делегатом метода, который возвращает true , если объект, переданный ему, соответствует условиям, определенным в делегате. Элементы текущего объекта List<T> передаются делегату по отдельности Predicate<T> . Делегат имеет подпись:

public bool methodName(T obj)  
Public Function methodName(obj As T) As Boolean  

Этот метод выполняет линейный поиск; таким образом, этот метод является операцией O(n), где ncount.

См. также раздел

Применяется к

FindIndex(Predicate<T>)

Выполняет поиск элемента, удовлетворяющего условиям указанного предиката, и возвращает отсчитываемый от нуля индекс первого найденного вхождения в пределах всего списка List<T>.

public:
 int FindIndex(Predicate<T> ^ match);
public int FindIndex (Predicate<T> match);
member this.FindIndex : Predicate<'T> -> int
Public Function FindIndex (match As Predicate(Of T)) As Integer

Параметры

match
Predicate<T>

Делегат Predicate<T>, определяющий условия поиска элемента.

Возвращаемое значение

Int32

Отсчитываемый от нуля индекс первого вхождения элемента, отвечающего условиям предиката match, если такой элемент найден. В противном случае значение –1.

Исключения

match имеет значение null.

Примеры

В следующем примере определяется Employee класс с двумя полями Name и Id. Он также определяет EmployeeSearch класс с одним методом, который указывает, StartsWithначинается ли Employee.Name поле с указанной подстроки, предоставляемой конструктору EmployeeSearch класса. Обратите внимание на сигнатуру этого метода.

public bool StartsWith(Employee e)  
Public Function StartsWith(e As Employee) As Boolean  

соответствует сигнатуре делегата, который можно передать методу FindIndex . В примере создается экземпляр List<Employee> объекта, добавляется к нему несколько Employee объектов, а затем FindIndex(Int32, Int32, Predicate<T>) вызывается метод дважды для поиска всей коллекции, первый раз для первого Employee объекта, поле которого начинается с "J", и второй раз для первого Employee объекта, поле которого Name Name начинается с "Ju".

using System;
using System.Collections.Generic;

public class Employee : IComparable
{
   public String Name { get; set; }
   public int Id { get; set; }

   public int CompareTo(Object o )
   {
      Employee e = o as Employee;
      if (e == null)
         throw new ArgumentException("o is not an Employee object.");

      return Name.CompareTo(e.Name);
   }
}

public class EmployeeSearch
{
   String _s;

   public EmployeeSearch(String s)
   {
      _s = s;
   }

   public bool StartsWith(Employee e)
   {
      return e.Name.StartsWith(_s, StringComparison.InvariantCultureIgnoreCase);
   }
}

public class Example
{
   public static void Main()
   {
      var employees = new List<Employee>();
      employees.AddRange( new Employee[] { new Employee { Name = "Frank", Id = 2 },
                                           new Employee { Name = "Jill", Id = 3 },
                                           new Employee { Name = "Dave", Id = 5 },
                                           new Employee { Name = "Jack", Id = 8 },
                                           new Employee { Name = "Judith", Id = 12 },
                                           new Employee { Name = "Robert", Id = 14 },
                                           new Employee { Name = "Adam", Id = 1 } } );
      employees.Sort();

      var es = new EmployeeSearch("J");
      Console.WriteLine("'J' starts at index {0}",
                        employees.FindIndex(es.StartsWith));

      es = new EmployeeSearch("Ju");
      Console.WriteLine("'Ju' starts at index {0}",
                        employees.FindIndex(es.StartsWith));
   }
}
// The example displays the following output:
//       'J' starts at index 3
//       'Ju' starts at index 5
Imports System.Collections.Generic

Public Class Employee : Implements IComparable
   Public Property Name As String
   Public Property Id As Integer
   
   Public Function CompareTo(o As Object) As Integer _
         Implements IComparable.CompareTo
      Dim e As Employee = TryCast(o, Employee)
      If e Is Nothing Then
         Throw New ArgumentException("o is not an Employee object.")
      End If

      Return Name.CompareTo(e.Name)
   End Function
End Class

Public Class EmployeeSearch
   Dim _s As String
   
   Public Sub New(s As String)
      _s = s
   End Sub
   
   Public Function StartsWith(e As Employee) As Boolean
      Return e.Name.StartsWith(_s, StringComparison.InvariantCultureIgnoreCase)
   End Function
End Class

Module Example
   Public Sub Main()
      Dim employees As New List(Of Employee)()
      employees.AddRange( { New Employee() With { .Name = "Frank", .Id = 2 },
                            New Employee() With { .Name = "Jill", .Id = 3 },
                            New Employee() With { .Name = "Dave", .Id = 5 },
                            New Employee() With { .Name = "Jack", .Id = 8 },
                            New Employee() With { .Name = "Judith", .Id = 12 },
                            New Employee() With { .Name = "Robert", .Id = 14 },
                            New Employee() With { .Name = "Adam", .Id = 1 } } )
      employees.Sort()

      Dim es As New EmployeeSearch("J")
      Console.WriteLine("'J' starts at index {0}",
                        employees.FindIndex(AddressOf es.StartsWith))
      es = New EmployeeSearch("Ju")
      Console.WriteLine("'Ju' starts at index {0}",
                        employees.FindIndex(AddressOf es.StartsWith))
   End Sub
End Module
' The example displays the following output:
'       'J' starts at index 3
'       'Ju' starts at index 5

Комментарии

Выполняется List<T> поиск вперед, начиная с первого элемента и заканчивая последним элементом.

Является Predicate<T> делегатом метода, который возвращает true , если объект, переданный ему, соответствует условиям, определенным в делегате. Элементы текущего объекта List<T> передаются делегату по отдельности Predicate<T> . Делегат имеет подпись:

public bool methodName(T obj)  
Public Function methodName(obj As T) As Boolean  

Этот метод выполняет линейный поиск; таким образом, этот метод является операцией O(n), где nCount.

См. также раздел

Применяется к

FindIndex(Int32, Predicate<T>)

Выполняет поиск элемента, удовлетворяющего условиям указанного предиката, и возвращает отсчитываемый от нуля индекс первого вхождения в диапазоне элементов списка List<T>, начиная с заданного индекса и заканчивая последним элементом.

public:
 int FindIndex(int startIndex, Predicate<T> ^ match);
public int FindIndex (int startIndex, Predicate<T> match);
member this.FindIndex : int * Predicate<'T> -> int
Public Function FindIndex (startIndex As Integer, match As Predicate(Of T)) As Integer

Параметры

startIndex
Int32

Индекс (с нуля) начальной позиции поиска.

match
Predicate<T>

Делегат Predicate<T>, определяющий условия поиска элемента.

Возвращаемое значение

Int32

Отсчитываемый от нуля индекс первого вхождения элемента, отвечающего условиям предиката match, если такой элемент найден. В противном случае значение –1.

Исключения

match имеет значение null.

startIndex находится вне диапазона допустимых индексов для List<T>.

Примеры

В следующем примере определяется Employee класс с двумя полями Name и Id. Он также определяет EmployeeSearch класс с одним методом, который указывает, StartsWithначинается ли Employee.Name поле с указанной подстроки, предоставляемой конструктору EmployeeSearch класса. Обратите внимание на сигнатуру этого метода.

public bool StartsWith(Employee e)  
Public Function StartsWith(e As Employee) As Boolean  

соответствует сигнатуре делегата, который можно передать методу FindIndex . В примере создается экземпляр List<Employee> объекта, добавляется к нему несколько объектов, а затем FindIndex(Int32, Int32, Predicate<T>) метод вызывается дважды для поиска коллекции, начиная с пятого Employee элемента (то есть элемента по индексу 4). При первом поиске Employee первого объекта, поле которого Name начинается с "J"; во второй раз выполняется поиск первого Employee объекта, поле которого Name начинается с "Ju".

using System;
using System.Collections.Generic;

public class Employee : IComparable
{
   public String Name { get; set; }
   public int Id { get; set; }

   public int CompareTo(Object o )
   {
      Employee e = o as Employee;
      if (e == null)
         throw new ArgumentException("o is not an Employee object.");

      return Name.CompareTo(e.Name);
   }
}

public class EmployeeSearch
{
   String _s;

   public EmployeeSearch(String s)
   {
      _s = s;
   }

   public bool StartsWith(Employee e)
   {
      return e.Name.StartsWith(_s, StringComparison.InvariantCultureIgnoreCase);
   }
}

public class Example
{
   public static void Main()
   {
      var employees = new List<Employee>();
      employees.AddRange( new Employee[] { new Employee { Name = "Frank", Id = 2 },
                                           new Employee { Name = "Jill", Id = 3 },
                                           new Employee { Name = "Dave", Id = 5 },
                                           new Employee { Name = "Jack", Id = 8 },
                                           new Employee { Name = "Judith", Id = 12 },
                                           new Employee { Name = "Robert", Id = 14 },
                                           new Employee { Name = "Adam", Id = 1 } } );
      employees.Sort();

      var es = new EmployeeSearch("J");
      int index = employees.FindIndex(4, es.StartsWith);
      Console.WriteLine("Starting index of'J': {0}",
                        index >= 0 ? index.ToString() : "Not found");

      es = new EmployeeSearch("Ju");
      index = employees.FindIndex(4, es.StartsWith);
      Console.WriteLine("Starting index of 'Ju': {0}",
                        index >= 0 ? index.ToString() : "Not found");
   }
}
// The example displays the following output:
//       'J' starts at index 4
//       'Ju' starts at index 5
Imports System.Collections.Generic

Public Class Employee : Implements IComparable
   Public Property Name As String
   Public Property Id As Integer
   
   Public Function CompareTo(o As Object) As Integer _
         Implements IComparable.CompareTo
      Dim e As Employee = TryCast(o, Employee)
      If e Is Nothing Then
         Throw New ArgumentException("o is not an Employee object.")
      End If

      Return Name.CompareTo(e.Name)
   End Function
End Class

Public Class EmployeeSearch
   Dim _s As String
   
   Public Sub New(s As String)
      _s = s
   End Sub
   
   Public Function StartsWith(e As Employee) As Boolean
      Return e.Name.StartsWith(_s, StringComparison.InvariantCultureIgnoreCase)
   End Function
End Class

Module Example
   Public Sub Main()
      Dim employees As New List(Of Employee)()
      employees.AddRange( { New Employee() With { .Name = "Frank", .Id = 2 },
                            New Employee() With { .Name = "Jill", .Id = 3 },
                            New Employee() With { .Name = "Dave", .Id = 5 },
                            New Employee() With { .Name = "Jack", .Id = 8 },
                            New Employee() With { .Name = "Judith", .Id = 12 },
                            New Employee() With { .Name = "Robert", .Id = 14 },
                            New Employee() With { .Name = "Adam", .Id = 1 } } )
      employees.Sort()

      Dim es As New EmployeeSearch("J")
      Dim index As Integer = employees.FindIndex(4, AddressOf es.StartsWith)        
      Console.WriteLine("Starting index of'J': {0}",
                        If(index >= 0, index.ToString(), "Not found"))

      es = New EmployeeSearch("Ju")
      index = employees.FindIndex(4, AddressOf es.StartsWith) 
      Console.WriteLine("Starting index of'Ju': {0}",
                        If(index >= 0, index.ToString(), "Not found"))

   End Sub
End Module
' The example displays the following output:
'       'J' starts at index 4
'       'Ju' starts at index 5

Комментарии

Выполняется List<T> поиск вперед, начиная с startIndex и заканчивая последним элементом.

Является Predicate<T> делегатом метода, который возвращает true , если объект, переданный ему, соответствует условиям, определенным в делегате. Элементы текущего объекта List<T> передаются делегату по отдельности Predicate<T> . Делегат имеет подпись:

public bool methodName(T obj)  
Public Function methodName(obj As T) As Boolean  

Этот метод выполняет линейный поиск; таким образом, этот метод является операцией O(n), где n является числом элементов от startIndex конца List<T>.

См. также раздел

Применяется к