List<T>.FindLast(Predicate<T>) Metoda
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Wyszukuje element zgodny z warunkami zdefiniowanymi przez określony predykat i zwraca ostatnie wystąpienie w całym List<T>obiekcie .
public:
T FindLast(Predicate<T> ^ match);
public T FindLast (Predicate<T> match);
public T? FindLast (Predicate<T> match);
member this.FindLast : Predicate<'T> -> 'T
Public Function FindLast (match As Predicate(Of T)) As T
Parametry
- match
- Predicate<T>
Predicate<T> Delegat, który definiuje warunki elementu do wyszukania.
Zwraca
Ostatni element zgodny z warunkami zdefiniowanymi przez określony predykat, jeśli zostanie znaleziony; w przeciwnym razie wartość domyślna dla typu T
.
Wyjątki
match
to null
.
Przykłady
W poniższym przykładzie przedstawiono metody znajdowania dla List<T> klasy. Przykład klasy zawiera obiekty klasy Book
, używając danych z przykładowego pliku XML: książki (LINQ to XML).book
List<T> Metoda FillList
w przykładzie używa LINQ to XML do analizowania wartości z xml na wartości book
właściwości obiektów.
W poniższej tabeli opisano przykłady podane dla metod find.
Metoda | Przykład |
---|---|
Find(Predicate<T>) | Znajduje książkę według identyfikatora przy użyciu delegata IDToFind predykatu.Przykład w języku C# używa delegata anonimowego. |
FindAll(Predicate<T>) | Znajdź wszystkie książki, które mają Genre właściwość "Komputer" przy użyciu delegata FindComputer predykatu. |
FindLast(Predicate<T>) | Znajduje ostatnią książkę w kolekcji, która ma datę publikacji przed 2001 r., używając delegata PubBefore2001 predykatu.Przykład w języku C# używa delegata anonimowego. |
FindIndex(Predicate<T>) | Znajduje indeks pierwszej książki komputerowej przy użyciu delegata FindComputer predykatu. |
FindLastIndex(Predicate<T>) | Znajduje indeks ostatniej książki komputerowej przy użyciu delegata FindComputer predykatu. |
FindIndex(Int32, Int32, Predicate<T>) | Znajduje indeks pierwszej książki komputerowej w drugiej połowie kolekcji przy użyciu delegata FindComputer predykatu. |
FindLastIndex(Int32, Int32, Predicate<T>) | Znajduje indeks ostatniej książki komputerowej w drugiej połowie kolekcji przy użyciu delegata FindComputer predykatu. |
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; }
}
}
Imports System.Collections.Generic
Imports System.Linq
Imports System.Xml.Linq
Module Module1
Private IDToFind As String = "bk109"
Public Books As New List(Of Book)
Sub Main()
FillList()
' Find a book by its ID.
Dim result As Book = Books.Find(AddressOf FindID)
If result IsNot Nothing Then
DisplayResult(result, "Find by ID: " & IDToFind)
Else
Console.WriteLine(vbCrLf & "Not found: " & IDToFind)
End If
Console.WriteLine()
' Find last book in collection that has a publish date before 2001.
result = Books.FindLast(AddressOf PubBefore2001)
If result IsNot Nothing Then
DisplayResult(result, "Last book in collection published before 2001:")
Else
Console.WriteLine(vbCrLf & "Not found: " & IDToFind)
End If
Console.WriteLine()
' Find all computer books.
Dim results As List(Of Book) = Books.FindAll(AddressOf FindComputer)
If results.Count <> 0 Then
DisplayResults(results, "All computer books:")
Else
Console.WriteLine(vbCrLf & "No books found.")
End If
Console.WriteLine()
' Find all books under $10.00.
results = Books.FindAll(AddressOf FindUnderTen)
If results.Count <> 0 Then
DisplayResults(results, "Books under $10:")
Else
Console.WriteLine(vbCrLf & "No books found.")
End If
Console.WriteLine()
' Find index values.
Console.WriteLine()
Dim ndx As Integer = Books.FindIndex(AddressOf FindComputer)
Console.WriteLine("Index of first computer book: " & ndx)
ndx = Books.FindLastIndex(AddressOf FindComputer)
Console.WriteLine("Index of last computer book: " & ndx)
Dim mid As Integer = Books.Count / 2
ndx = Books.FindIndex(mid, mid, AddressOf FindComputer)
Console.WriteLine("Index of first computer book in the second half of the collection: " & ndx)
ndx = Books.FindLastIndex(Books.Count - 1, mid, AddressOf FindComputer)
Console.WriteLine("Index of last computer book in the second half of the collection: " & ndx)
End Sub
Private Sub FillList()
' Create XML elements from a source file.
Dim xTree As XElement = XElement.Load("c:\temp\books.xml")
' Create an enumerable collection of the elements.
Dim elements As IEnumerable(Of XElement) = xTree.Elements
' Evaluate each element and set values in the book object.
For Each el As XElement In elements
Dim Book As New Book()
Book.ID = el.Attribute("id").Value
Dim props As IEnumerable(Of XElement) = el.Elements
For Each p As XElement In props
If p.Name.ToString.ToLower = "author" Then
Book.Author = p.Value
End If
If p.Name.ToString.ToLower = "title" Then
Book.Title = p.Value
End If
If p.Name.ToString.ToLower = "genre" Then
Book.Genre = p.Value
End If
If p.Name.ToString.ToLower = "price" Then
Book.Price = Convert.ToDouble(p.Value)
End If
If p.Name.ToString.ToLower = "publish_date" Then
Book.Publish_date = Convert.ToDateTime(p.Value)
End If
If p.Name.ToString.ToLower = "description" Then
Book.Description = p.Value
End If
Next
Books.Add(Book)
Next
DisplayResults(Books, "All books:")
Console.WriteLine()
End Sub
' Predicate delegates for
' Find and FindAll methods.
Private Function FindID(ByVal bk As Book) As Boolean
If bk.ID = IDToFind Then
Return True
Else
Return False
End If
End Function
Private Function FindComputer(ByVal bk As Book) As Boolean
If bk.Genre = "Computer" Then
Return True
Else
Return False
End If
End Function
Private Function FindUnderTen(ByVal bk As Book) As Boolean
Dim tendollars As Double = 10.0
If bk.Price < tendollars Then
Return True
Else
Return False
End If
End Function
Private Function PubBefore2001(ByVal bk As Book) As Boolean
Dim year2001 As DateTime = New DateTime(2001, 1, 1)
Return bk.Publish_date < year2001
End Function
Private Sub DisplayResult(ByVal result As Book, ByVal title As String)
Console.WriteLine()
Console.WriteLine(title)
Console.WriteLine(vbLf & result.ID & vbTab & result.Author & _
vbTab & result.Title & vbTab & result.Genre & _
vbTab & result.Publish_date & vbTab & result.Price)
Console.WriteLine()
End Sub
Private Sub DisplayResults(ByVal results As List(Of Book), ByVal title As String)
Console.WriteLine()
Console.WriteLine(title)
For Each b As Book In results
Console.Write(vbLf & b.ID & vbTab & b.Author & _
vbTab & b.Title & vbTab & b.Genre & _
vbTab & b.Publish_date & vbTab & b.Price)
Next
Console.WriteLine()
End Sub
Public Class Book
Public ID As String
Public Author As String
Public Title As String
Public Genre As String
Public Price As Double
Public Publish_date As DateTime
Public Description As String
End Class
End Module
Uwagi
Jest Predicate<T> delegatem do metody, która zwraca true
, jeśli obiekt przekazany do niego jest zgodny z warunkami zdefiniowanymi w delegatu. Elementy bieżące List<T> są indywidualnie przekazywane do delegata Predicate<T> , przechodząc do tyłu List<T>w elemencie , zaczynając od ostatniego elementu i kończąc na pierwszym elemencie. Przetwarzanie jest zatrzymywane po znalezieniu dopasowania.
Ważne
Podczas wyszukiwania listy zawierającej typy wartości upewnij się, że wartość domyślna typu nie spełnia wymagań predykatu wyszukiwania. W przeciwnym razie nie ma możliwości rozróżnienia między wartością domyślną wskazującą, że nie znaleziono dopasowania, a elementem listy, który ma wartość domyślną dla typu. Jeśli wartość domyślna spełnia predykat wyszukiwania, użyj FindLastIndex metody .
Ta metoda wykonuje wyszukiwanie liniowe; dlatego ta metoda jest operacją O(n), gdzie n to Count.