Прочитать на английском

Поделиться через


List<T>.FindLastIndex Метод

Определение

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

Перегрузки

FindLastIndex(Predicate<T>)

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

FindLastIndex(Int32, Predicate<T>)

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

FindLastIndex(Int32, Int32, Predicate<T>)

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

FindLastIndex(Predicate<T>)

Исходный код:
List.cs
Исходный код:
List.cs
Исходный код:
List.cs

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

public int FindLastIndex (Predicate<T> match);

Параметры

match
Predicate<T>

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

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

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

Исключения

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

Примеры

В следующем примере показаны методы поиска для List<T> класса . Пример для List<T> класса содержит book объекты класса Book, используя данные из примера XML-файла: Книги (LINQ to XML). Метод FillList в примере использует LINQ to XML для синтаксического анализа значений xml до значений book свойств объектов .

В следующей таблице описаны примеры для методов поиска.

Метод Пример
Find(Predicate<T>) Находит книгу по идентификатору с помощью делегата IDToFind предиката.

В примере C# используется анонимный делегат.
FindAll(Predicate<T>) Найдите все книги со Genre свойством "Computer" с помощью делегата FindComputer предиката.
FindLast(Predicate<T>) Находит последнюю книгу в коллекции с датой публикации до 2001 года с помощью делегата PubBefore2001 предиката.

В примере C# используется анонимный делегат.
FindIndex(Predicate<T>) Находит индекс первой компьютерной книги с помощью делегата FindComputer предиката.
FindLastIndex(Predicate<T>) Находит индекс последней компьютерной книги с помощью делегата FindComputer предиката.
FindIndex(Int32, Int32, Predicate<T>) Находит индекс первой компьютерной книги во второй половине коллекции с помощью делегата FindComputer предиката.
FindLastIndex(Int32, Int32, Predicate<T>) Находит индекс последней компьютерной книги во второй половине коллекции с помощью делегата FindComputer предиката.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;

namespace Find
{
    class Program
    {
        private static string IDtoFind = "bk109";

        private static List<Book> Books = new List<Book>();
        public static void Main(string[] args)
        {
            FillList();

            // Find a book by its ID.
            Book result = Books.Find(
            delegate(Book bk)
            {
                return bk.ID == IDtoFind;
            }
            );
            if (result != null)
            {
                DisplayResult(result, "Find by ID: " + IDtoFind);
            }
            else
            {
                Console.WriteLine("\nNot found: {0}", IDtoFind);
            }

            // Find last book in collection published before 2001.
            result = Books.FindLast(
            delegate(Book bk)
            {
                DateTime year2001 = new DateTime(2001,01,01);
                return bk.Publish_date < year2001;
            });
            if (result != null)
            {
                DisplayResult(result, "Last book in collection published before 2001:");
            }
            else
            {
                Console.WriteLine("\nNot found: {0}", IDtoFind);
            }

            // Find all computer books.
            List<Book> results = Books.FindAll(FindComputer);
            if (results.Count != 0)
            {
                DisplayResults(results, "All computer:");
            }
            else
            {
                Console.WriteLine("\nNo books found.");
            }

            // Find all books under $10.00.
            results = Books.FindAll(
            delegate(Book bk)
            {
                return bk.Price < 10.00;
            }
            );
            if (results.Count != 0)
            {
                DisplayResults(results, "Books under $10:");
            }
            else
            {
                Console.WriteLine("\nNo books found.");
            }

            // Find index values.
            Console.WriteLine();
            int ndx = Books.FindIndex(FindComputer);
            Console.WriteLine("Index of first computer book: {0}", ndx);
            ndx = Books.FindLastIndex(FindComputer);
            Console.WriteLine("Index of last computer book: {0}", ndx);

            int mid = Books.Count / 2;
            ndx = Books.FindIndex(mid, mid, FindComputer);
            Console.WriteLine("Index of first computer book in the second half of the collection: {0}", ndx);

            ndx = Books.FindLastIndex(Books.Count - 1, mid, FindComputer);
            Console.WriteLine("Index of last computer book in the second half of the collection: {0}", ndx);
        }

        // Populates the list with sample data.
        private static void FillList()
        {

            // Create XML elements from a source file.
            XElement xTree = XElement.Load(@"c:\temp\books.xml");

            // Create an enumerable collection of the elements.
            IEnumerable<XElement> elements = xTree.Elements();

            // Evaluate each element and set set values in the book object.
            foreach (XElement el in elements)
            {
                Book book = new Book();
                book.ID = el.Attribute("id").Value;
                IEnumerable<XElement> props = el.Elements();
                foreach (XElement p in props)
                {

                    if (p.Name.ToString().ToLower() == "author")
                    {
                        book.Author = p.Value;
                    }
                    else if (p.Name.ToString().ToLower() == "title")
                    {
                        book.Title = p.Value;
                    }
                    else if (p.Name.ToString().ToLower() == "genre")
                    {
                        book.Genre = p.Value;
                    }
                    else if (p.Name.ToString().ToLower() == "price")
                    {
                        book.Price = Convert.ToDouble(p.Value);
                    }
                    else if (p.Name.ToString().ToLower() == "publish_date")
                    {
                        book.Publish_date = Convert.ToDateTime(p.Value);
                    }
                    else if (p.Name.ToString().ToLower() == "description")
                    {
                        book.Description = p.Value;
                    }
                }

                Books.Add(book);
            }

            DisplayResults(Books, "All books:");
        }

        // Explicit predicate delegate.
        private static bool FindComputer(Book bk)
        {

            if (bk.Genre == "Computer")
            {
                return true;
            }
        else
            {
                return false;
            }
        }

        private static void DisplayResult(Book result, string title)
        {
            Console.WriteLine();
            Console.WriteLine(title);
            Console.WriteLine("\n{0}\t{1}\t{2}\t{3}\t{4}\t{5}", result.ID,
                result.Author, result.Title, result.Genre, result.Price,
                result.Publish_date.ToShortDateString());
            Console.WriteLine();
        }

        private static void DisplayResults(List<Book> results, string title)
        {
            Console.WriteLine();
            Console.WriteLine(title);
            foreach (Book b in results)
            {

                Console.Write("\n{0}\t{1}\t{2}\t{3}\t{4}\t{5}", b.ID,
                    b.Author, b.Title, b.Genre, b.Price,
                    b.Publish_date.ToShortDateString());
            }
            Console.WriteLine();
        }
    }

    public class Book
    {
        public string ID { get; set; }
        public string Author { get; set; }
        public string Title { get; set; }
        public string Genre { get; set; }
        public double Price { get; set; }
        public DateTime Publish_date { get; set; }
        public string Description { get; set; }
    }
}

Комментарии

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

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

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

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

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

.NET 9 и другие версии
Продукт Версии
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.6, 2.0, 2.1
UWP 10.0

FindLastIndex(Int32, Predicate<T>)

Исходный код:
List.cs
Исходный код:
List.cs
Исходный код:
List.cs

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

public int FindLastIndex (int startIndex, Predicate<T> match);

Параметры

startIndex
Int32

Индекс (с нуля) начала диапазона поиска в обратном направлении.

match
Predicate<T>

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

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

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

Исключения

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

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

Комментарии

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

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

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

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

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

.NET 9 и другие версии
Продукт Версии
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.6, 2.0, 2.1
UWP 10.0

FindLastIndex(Int32, Int32, Predicate<T>)

Исходный код:
List.cs
Исходный код:
List.cs
Исходный код:
List.cs

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

public int FindLastIndex (int startIndex, int count, Predicate<T> match);

Параметры

startIndex
Int32

Индекс (с нуля) начала диапазона поиска в обратном направлении.

count
Int32

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

match
Predicate<T>

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

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

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

Исключения

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

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

-или-

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

-или-

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

Примеры

В следующем примере показаны методы поиска для List<T> класса . Пример для List<T> класса содержит book объекты класса Book, используя данные из примера XML-файла: Книги (LINQ to XML). Метод FillList в примере использует LINQ to XML для синтаксического анализа значений xml до значений book свойств объектов .

В следующей таблице описаны примеры для методов поиска.

Метод Пример
Find(Predicate<T>) Находит книгу по идентификатору с помощью делегата IDToFind предиката.

В примере C# используется анонимный делегат.
FindAll(Predicate<T>) Найдите все книги со Genre свойством "Computer" с помощью делегата FindComputer предиката.
FindLast(Predicate<T>) Находит последнюю книгу в коллекции с датой публикации до 2001 года с помощью делегата PubBefore2001 предиката.

В примере C# используется анонимный делегат.
FindIndex(Predicate<T>) Находит индекс первой компьютерной книги с помощью делегата FindComputer предиката.
FindLastIndex(Predicate<T>) Находит индекс последней компьютерной книги с помощью делегата FindComputer предиката.
FindIndex(Int32, Int32, Predicate<T>) Находит индекс первой компьютерной книги во второй половине коллекции с помощью делегата FindComputer предиката.
FindLastIndex(Int32, Int32, Predicate<T>) Находит индекс последней компьютерной книги во второй половине коллекции с помощью делегата FindComputer предиката.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;

namespace Find
{
    class Program
    {
        private static string IDtoFind = "bk109";

        private static List<Book> Books = new List<Book>();
        public static void Main(string[] args)
        {
            FillList();

            // Find a book by its ID.
            Book result = Books.Find(
            delegate(Book bk)
            {
                return bk.ID == IDtoFind;
            }
            );
            if (result != null)
            {
                DisplayResult(result, "Find by ID: " + IDtoFind);
            }
            else
            {
                Console.WriteLine("\nNot found: {0}", IDtoFind);
            }

            // Find last book in collection published before 2001.
            result = Books.FindLast(
            delegate(Book bk)
            {
                DateTime year2001 = new DateTime(2001,01,01);
                return bk.Publish_date < year2001;
            });
            if (result != null)
            {
                DisplayResult(result, "Last book in collection published before 2001:");
            }
            else
            {
                Console.WriteLine("\nNot found: {0}", IDtoFind);
            }

            // Find all computer books.
            List<Book> results = Books.FindAll(FindComputer);
            if (results.Count != 0)
            {
                DisplayResults(results, "All computer:");
            }
            else
            {
                Console.WriteLine("\nNo books found.");
            }

            // Find all books under $10.00.
            results = Books.FindAll(
            delegate(Book bk)
            {
                return bk.Price < 10.00;
            }
            );
            if (results.Count != 0)
            {
                DisplayResults(results, "Books under $10:");
            }
            else
            {
                Console.WriteLine("\nNo books found.");
            }

            // Find index values.
            Console.WriteLine();
            int ndx = Books.FindIndex(FindComputer);
            Console.WriteLine("Index of first computer book: {0}", ndx);
            ndx = Books.FindLastIndex(FindComputer);
            Console.WriteLine("Index of last computer book: {0}", ndx);

            int mid = Books.Count / 2;
            ndx = Books.FindIndex(mid, mid, FindComputer);
            Console.WriteLine("Index of first computer book in the second half of the collection: {0}", ndx);

            ndx = Books.FindLastIndex(Books.Count - 1, mid, FindComputer);
            Console.WriteLine("Index of last computer book in the second half of the collection: {0}", ndx);
        }

        // Populates the list with sample data.
        private static void FillList()
        {

            // Create XML elements from a source file.
            XElement xTree = XElement.Load(@"c:\temp\books.xml");

            // Create an enumerable collection of the elements.
            IEnumerable<XElement> elements = xTree.Elements();

            // Evaluate each element and set set values in the book object.
            foreach (XElement el in elements)
            {
                Book book = new Book();
                book.ID = el.Attribute("id").Value;
                IEnumerable<XElement> props = el.Elements();
                foreach (XElement p in props)
                {

                    if (p.Name.ToString().ToLower() == "author")
                    {
                        book.Author = p.Value;
                    }
                    else if (p.Name.ToString().ToLower() == "title")
                    {
                        book.Title = p.Value;
                    }
                    else if (p.Name.ToString().ToLower() == "genre")
                    {
                        book.Genre = p.Value;
                    }
                    else if (p.Name.ToString().ToLower() == "price")
                    {
                        book.Price = Convert.ToDouble(p.Value);
                    }
                    else if (p.Name.ToString().ToLower() == "publish_date")
                    {
                        book.Publish_date = Convert.ToDateTime(p.Value);
                    }
                    else if (p.Name.ToString().ToLower() == "description")
                    {
                        book.Description = p.Value;
                    }
                }

                Books.Add(book);
            }

            DisplayResults(Books, "All books:");
        }

        // Explicit predicate delegate.
        private static bool FindComputer(Book bk)
        {

            if (bk.Genre == "Computer")
            {
                return true;
            }
        else
            {
                return false;
            }
        }

        private static void DisplayResult(Book result, string title)
        {
            Console.WriteLine();
            Console.WriteLine(title);
            Console.WriteLine("\n{0}\t{1}\t{2}\t{3}\t{4}\t{5}", result.ID,
                result.Author, result.Title, result.Genre, result.Price,
                result.Publish_date.ToShortDateString());
            Console.WriteLine();
        }

        private static void DisplayResults(List<Book> results, string title)
        {
            Console.WriteLine();
            Console.WriteLine(title);
            foreach (Book b in results)
            {

                Console.Write("\n{0}\t{1}\t{2}\t{3}\t{4}\t{5}", b.ID,
                    b.Author, b.Title, b.Genre, b.Price,
                    b.Publish_date.ToShortDateString());
            }
            Console.WriteLine();
        }
    }

    public class Book
    {
        public string ID { get; set; }
        public string Author { get; set; }
        public string Title { get; set; }
        public string Genre { get; set; }
        public double Price { get; set; }
        public DateTime Publish_date { get; set; }
        public string Description { get; set; }
    }
}

Комментарии

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

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

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

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

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

.NET 9 и другие версии
Продукт Версии
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.6, 2.0, 2.1
UWP 10.0