Auf Englisch lesen

Freigeben über


List<T>.FindLast(Predicate<T>) Methode

Definition

Sucht nach einem Element, das die durch das angegebene Prädikat definierten Bedingungen erfüllt, und gibt das letzte Vorkommen im gesamten List<T> zurück.

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

Parameter

match
Predicate<T>

Der Predicate<T>-Delegat, der die Bedingungen für das Element definiert, nach dem gesucht werden soll.

Gibt zurück

T

Das letzte Element, das die durch das angegebene Prädikat definierten Bedingungen erfüllt, sofern vorhanden, andernfalls der Standardwert für den Typ T.

Ausnahmen

match ist null.

Beispiele

Im folgenden Beispiel werden die Find-Methoden für die List<T> -Klasse veranschaulicht. Das Beispiel für die List<T> -Klasse enthält book Objekte der -KlasseBook, die die Daten aus der Beispiel-XML-Datei: Books (LINQ to XML) verwenden. Die FillList -Methode im Beispiel verwendet LINQ to XML, um die Werte aus dem XML-Code in Eigenschaftswerte der book -Objekte zu analysieren.

In der folgenden Tabelle werden die Beispiele für die Find-Methoden beschrieben.

Methode Beispiel
Find(Predicate<T>) Sucht ein Buch anhand einer ID mithilfe des IDToFind Prädikatdelten.

C#-Beispiel verwendet einen anonymen Delegaten.
FindAll(Predicate<T>) Suchen Sie alle Bücher, deren Genre Eigenschaft "Computer" ist, mithilfe des FindComputer Prädikatdelten.
FindLast(Predicate<T>) Sucht das letzte Buch in der Sammlung mit einem Veröffentlichungsdatum vor 2001, wobei der PubBefore2001 Prädikatdelegate verwendet wird.

C#-Beispiel verwendet einen anonymen Delegaten.
FindIndex(Predicate<T>) Sucht den Index des ersten Computerbuchs mithilfe des FindComputer Prädikatdelten.
FindLastIndex(Predicate<T>) Sucht den Index des letzten Computerbuchs mithilfe des FindComputer Prädikatdelten.
FindIndex(Int32, Int32, Predicate<T>) Sucht den Index des ersten Computerbuchs in der zweiten Hälfte der Auflistung mithilfe des FindComputer Prädikatdelten.
FindLastIndex(Int32, Int32, Predicate<T>) Sucht den Index des letzten Computerbuchs in der zweiten Hälfte der Auflistung mithilfe des FindComputer Prädikatdelten.
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; }
    }
}

Hinweise

ist Predicate<T> ein Delegat an eine Methode, die zurückgibt true , wenn das an sie übergebene Objekt den im Delegaten definierten Bedingungen entspricht. Die Elemente des aktuellen werden einzeln an den Predicate<T> Delegaten List<T> übergeben, wobei sie sich in rückwärts List<T>bewegen, beginnend mit dem letzten Element und endend mit dem ersten Element. Die Verarbeitung wird beendet, wenn eine Übereinstimmung gefunden wird.

Wichtig

Stellen Sie beim Durchsuchen einer Liste mit Werttypen sicher, dass der Standardwert für den Typ nicht dem Such-Prädikat entspricht. Andernfalls gibt es keine Möglichkeit, zwischen einem Standardwert zu unterscheiden, der angibt, dass keine Übereinstimmung gefunden wurde, und einem List-Element, das den Standardwert für den Typ aufweist. Wenn der Standardwert das Such-Prädikat erfüllt, verwenden Sie stattdessen die FindLastIndex -Methode.

Diese Methode führt eine lineare Suche aus. Daher handelt es sich bei dieser Methode um einen O(n)-Vorgang, wobei n für steht Count.

Gilt für:

Produkt Versionen
.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

Weitere Informationen