Ler em inglês

Partilhar via


List<T>.FindLast(Predicate<T>) Método

Definição

Pesquisa um elemento que corresponda às condições definidas pelo predicado especificado e retorna a primeira ocorrência em toda a List<T>.

C#
public T FindLast (Predicate<T> match);
C#
public T? FindLast (Predicate<T> match);

Parâmetros

match
Predicate<T>

O delegado Predicate<T> que define as condições do elemento a ser pesquisado.

Retornos

T

O último elemento que corresponde às condições definidas pelo predicado especificado, se encontrado; caso contrário, o valor padrão para o tipo T.

Exceções

match é null.

Exemplos

O exemplo a seguir demonstra os métodos find para a List<T> classe . O exemplo para a List<T> classe contém book objetos, da classe Book, usando os dados do Arquivo XML de Exemplo: Livros (LINQ to XML). O FillList método no exemplo usa LINQ to XML para analisar os valores do XML para os valores de propriedade dos book objetos.

A tabela a seguir descreve os exemplos fornecidos para os métodos find.

Método Exemplo
Find(Predicate<T>) Localiza um livro por uma ID usando o delegado de IDToFind predicado.

O exemplo de C# usa um delegado anônimo.
FindAll(Predicate<T>) Encontre todos os livros cuja Genre propriedade é "Computador" usando o delegado de FindComputer predicado.
FindLast(Predicate<T>) Localiza o último livro na coleção que tem uma data de publicação antes de 2001, usando o delegado de PubBefore2001 predicado.

O exemplo de C# usa um delegado anônimo.
FindIndex(Predicate<T>) Localiza o índice do primeiro livro do computador usando o delegado de FindComputer predicado.
FindLastIndex(Predicate<T>) Localiza o índice do último livro do computador usando o delegado de FindComputer predicado.
FindIndex(Int32, Int32, Predicate<T>) Localiza o índice do primeiro livro de computador na segunda metade da coleção, usando o delegado de FindComputer predicado.
FindLastIndex(Int32, Int32, Predicate<T>) Localiza o índice do último livro de computador na segunda metade da coleção, usando o delegado de FindComputer predicado.
C#
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; }
    }
}

Comentários

O Predicate<T> é um representante para um método que retorna true caso o objeto passado para ele corresponda às condições definidas no representante. Os elementos do atual List<T> são passados individualmente para o Predicate<T> delegado, movendo-se para trás no List<T>, começando com o último elemento e terminando com o primeiro elemento. O processamento é interrompido quando uma correspondência é encontrada.

Importante

Ao pesquisar uma lista que contém tipos de valor, verifique se o valor padrão para o tipo não satisfaz o predicado de pesquisa. Caso contrário, não há como distinguir entre um valor padrão que indica que nenhuma correspondência foi encontrada e um elemento de lista que tem o valor padrão para o tipo. Se o valor padrão atender ao predicado de pesquisa, use o FindLastIndex método .

Esse método executa uma pesquisa linear; portanto, esse método é uma operação O(n), em que n é Count.

Aplica-se a

Produto Versões
.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

Confira também