List<T>.Find(Predicate<T>) 메서드
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
지정된 조건자에 정의된 조건과 일치하는 요소를 검색하고 전체 List<T>에서 처음으로 검색한 요소를 반환합니다.
public:
T Find(Predicate<T> ^ match);
public T Find (Predicate<T> match);
public T? Find (Predicate<T> match);
member this.Find : Predicate<'T> -> 'T
Public Function Find (match As Predicate(Of T)) As T
매개 변수
- match
- Predicate<T>
검색할 요소의 조건을 정의하는 Predicate<T> 대리자입니다.
반환
지정된 조건자에 정의된 조건과 일치하는 요소가 있으면 일치하는 요소 중 첫 번째 요소이고, 그렇지 않으면 T
형식의 기본값입니다.
예외
match
이(가) null
인 경우
예제
다음 예제에서는 Find 간단한 복합 개체를 List<T> 포함 하는 의 메서드를 보여 줍니다.
using System;
using System.Collections.Generic;
// Simple business object. A PartId is used to identify a part
// but the part name can change.
public class Part : IEquatable<Part>
{
public string PartName { get; set; }
public int PartId { get; set; }
public override string ToString()
{
return "ID: " + PartId + " Name: " + PartName;
}
public override bool Equals(object obj)
{
if (obj == null) return false;
Part objAsPart = obj as Part;
if (objAsPart == null) return false;
else return Equals(objAsPart);
}
public override int GetHashCode()
{
return PartId;
}
public bool Equals(Part other)
{
if (other == null) return false;
return (this.PartId.Equals(other.PartId));
}
// Should also override == and != operators.
}
public class Example
{
public static void Main()
{
// Create a list of parts.
List<Part> parts = new List<Part>();
// Add parts to the list.
parts.Add(new Part() { PartName = "crank arm", PartId = 1234 });
parts.Add(new Part() { PartName = "chain ring", PartId = 1334 });
parts.Add(new Part() { PartName = "regular seat", PartId = 1434 });
parts.Add(new Part() { PartName = "banana seat", PartId = 1444 });
parts.Add(new Part() { PartName = "cassette", PartId = 1534 });
parts.Add(new Part() { PartName = "shift lever", PartId = 1634 }); ;
// Write out the parts in the list. This will call the overridden ToString method
// in the Part class.
Console.WriteLine();
foreach (Part aPart in parts)
{
Console.WriteLine(aPart);
}
// Check the list for part #1734. This calls the IEquatable.Equals method
// of the Part class, which checks the PartId for equality.
Console.WriteLine("\nContains: Part with Id=1734: {0}",
parts.Contains(new Part { PartId = 1734, PartName = "" }));
// Find items where name contains "seat".
Console.WriteLine("\nFind: Part where name contains \"seat\": {0}",
parts.Find(x => x.PartName.Contains("seat")));
// Check if an item with Id 1444 exists.
Console.WriteLine("\nExists: Part with Id=1444: {0}",
parts.Exists(x => x.PartId == 1444));
/*This code example produces the following output:
ID: 1234 Name: crank arm
ID: 1334 Name: chain ring
ID: 1434 Name: regular seat
ID: 1444 Name: banana seat
ID: 1534 Name: cassette
ID: 1634 Name: shift lever
Contains: Part with Id=1734: False
Find: Part where name contains "seat": ID: 1434 Name: regular seat
Exists: Part with Id=1444: True
*/
}
}
Imports System.Collections.Generic
' Simple business object. A PartId is used to identify a part
' but the part name can change.
Public Class Part
Implements IEquatable(Of Part)
Public Property PartName() As String
Get
Return m_PartName
End Get
Set(value As String)
m_PartName = Value
End Set
End Property
Private m_PartName As String
Public Property PartId() As Integer
Get
Return m_PartId
End Get
Set(value As Integer)
m_PartId = Value
End Set
End Property
Private m_PartId As Integer
Public Overrides Function ToString() As String
Return Convert.ToString("ID: " & PartId & " Name: ") & PartName
End Function
Public Overrides Function Equals(obj As Object) As Boolean
If obj Is Nothing Then
Return False
End If
Dim objAsPart As Part = TryCast(obj, Part)
If objAsPart Is Nothing Then
Return False
Else
Return Equals(objAsPart)
End If
End Function
Public Overrides Function GetHashCode() As Integer
Return PartId
End Function
Public Overloads Function Equals(other As Part) As Boolean _
Implements IEquatable(Of Part).Equals
If other Is Nothing Then
Return False
End If
Return (Me.PartId.Equals(other.PartId))
End Function
' Should also override == and != operators.
End Class
Public Class Example
Public Shared Sub Main()
' Create a list of parts.
Dim parts As New List(Of Part)()
' Add parts to the list.
parts.Add(New Part() With { _
.PartName = "crank arm", _
.PartId = 1234 _
})
parts.Add(New Part() With { _
.PartName = "chain ring", _
.PartId = 1334 _
})
parts.Add(New Part() With { _
.PartName = "regular seat", _
.PartId = 1434 _
})
parts.Add(New Part() With { _
.PartName = "banana seat", _
.PartId = 1444 _
})
parts.Add(New Part() With { _
.PartName = "cassette", _
.PartId = 1534 _
})
parts.Add(New Part() With { _
.PartName = "shift lever", _
.PartId = 1634 _
})
' Write out the parts in the list. This will call the overridden ToString method
' in the Part class.
Console.WriteLine()
For Each aPart As Part In parts
Console.WriteLine(aPart)
Next
' Check the list for part #1734. This calls the IEquatable.Equals method
' of the Part class, which checks the PartId for equality.
Console.WriteLine(vbLf & "Contains: Part with Id=1734: {0}",
parts.Contains(New Part() With { _
.PartId = 1734, _
.PartName = "" _
}))
' Find items where name contains "seat".
Console.WriteLine(vbLf & "Find: Part where name contains ""seat"": {0}",
parts.Find(Function(x) x.PartName.Contains("seat")))
' Check if an item with Id 1444 exists.
Console.WriteLine(vbLf & "Exists: Part with Id=1444: {0}",
parts.Exists(Function(x) x.PartId = 1444))
'This code example produces the following output:
'
' ID: 1234 Name: crank arm
' ID: 1334 Name: chain ring
' ID: 1434 Name: regular seat
' ID: 1444 Name: banana seat
' ID: 1534 Name: cassette
' ID: 1634 Name: shift lever
'
' Contains: Part with Id=1734: False
'
' Find: Part where name contains "seat": ID: 1434 Name: regular seat
'
' Exists: Part with Id=1444: True
'
End Sub
End Class
다음 예제에서는 클래스에 대 한 찾기 메서드를 보여 줍니다 List<T> . 클래스의 List<T> 예제에는 샘플 XML 파일: Books(LINQ to XML)의 데이터를 사용하여 클래스 Book
의 개체가 포함됩니다book
. 예제의 메서드는 FillList
LINQ to XML 사용하여 XML의 값을 개체의 book
속성 값으로 구문 분석합니다.
다음 표에서는 찾기 메서드에 제공된 예제를 설명합니다.
방법 | 예제 |
---|---|
Find(Predicate<T>) | 조건자 대리자를 사용하여 ID로 IDToFind 책을 찾습니다.C# 예제에서는 익명 대리자를 사용합니다. |
FindAll(Predicate<T>) | 조건자 대리자를 사용하여 FindComputer 속성이 Genre "컴퓨터"인 모든 책을 찾습니다. |
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; }
}
}
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
설명
는 Predicate<T> 전달된 개체가 대리자에서 정의된 조건과 일치하는 경우 를 반환 true
하는 메서드에 대한 대리자입니다. 현재 List<T> 요소는 대리자에게 Predicate<T> 개별적으로 전달되어 에서 List<T>앞으로 이동하고 첫 번째 요소부터 시작하여 마지막 요소로 끝납니다. 일치 항목이 발견되면 처리가 중지됩니다.
중요
값 형식이 포함된 목록을 검색할 때 형식의 기본값이 검색 조건자를 충족하지 않는지 확인합니다. 그렇지 않으면 일치하는 항목이 없음을 나타내는 기본값과 형식의 기본값이 있는 list 요소를 구분할 수 없습니다. 기본값이 검색 조건자를 충족하는 경우 메서드를 대신 사용합니다 FindIndex .
이 메서드는 선형 검색을 수행합니다. 따라서 이 메서드는 O(n) 작업이며 여기서 n 은 입니다 Count.
적용 대상
추가 정보
.NET