Array.FindAll<T>(T[], 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.
Pobiera wszystkie elementy zgodne z warunkami zdefiniowanymi przez określony predykat.
public:
generic <typename T>
static cli::array <T> ^ FindAll(cli::array <T> ^ array, Predicate<T> ^ match);
public static T[] FindAll<T> (T[] array, Predicate<T> match);
static member FindAll : 'T[] * Predicate<'T> -> 'T[]
Public Shared Function FindAll(Of T) (array As T(), match As Predicate(Of T)) As T()
Parametry typu
- T
Typ elementów tablicy.
Parametry
- array
- T[]
Jednowymiarowe, zero oparte na Array wyszukiwaniu.
- match
- Predicate<T>
Element Predicate<T> definiujący warunki elementów do wyszukania.
Zwraca
- T[]
Element Array zawierający wszystkie elementy zgodne z warunkami zdefiniowanymi przez określony predykat, jeśli zostanie znaleziony; w przeciwnym razie pusty Arrayelement .
Wyjątki
Przykłady
Poniższy przykład tworzy tablicę 50 liczb losowych z wartościami, które mogą mieścić się w zakresie od 0 do 1000. Następnie wywołuje metodę FindAll z wyrażeniem lambda, które zwraca wartości z zakresu od 300 do 600. Należy zauważyć, że wyrażenie lambda jest przekazywane parametr o nazwie x
; reprezentuje pojedynczy element członkowski tablicy, który jest przekazywany do obiektu Predicate<T>. Należy również pamiętać, że zmienne lokalne lBound
i uBound
są dostępne w wyrażeniu lambda.
using System;
using System.Collections.Generic;
public class Example
{
public static void Main()
{
// Get an array of n random integers.
int[] values = GetArray(50, 0, 1000);
int lBound = 300;
int uBound = 600;
int[] matchedItems = Array.FindAll(values, x =>
x >= lBound && x <= uBound);
for (int ctr = 0; ctr < matchedItems.Length; ctr++) {
Console.Write("{0} ", matchedItems[ctr]);
if ((ctr + 1) % 12 == 0)
Console.WriteLine();
}
}
private static int[] GetArray(int n, int lower, int upper)
{
Random rnd = new Random();
List<int> list = new List<int>();
for (int ctr = 1; ctr <= n; ctr++)
list.Add(rnd.Next(lower, upper + 1));
return list.ToArray();
}
}
// The example displays output similar to the following:
// 542 398 356 351 348 301 562 599 575 400 569 306
// 535 416 393 385
open System
let getArray n lower upper =
let rnd = Random()
[| for _ = 1 to n do
rnd.Next(lower, upper + 1) |]
// Get an array of n random integers.
let values = getArray 50 0 1000
let lBound = 300
let uBound = 600
let matchedItems = Array.FindAll(values, fun x -> x >= lBound && x <= uBound)
for i = 0 to matchedItems.Length - 1 do
printf $"{matchedItems[i]} "
if (i + 1) % 12 = 0 then printfn ""
// The example displays output similar to the following:
// 542 398 356 351 348 301 562 599 575 400 569 306
// 535 416 393 385
Imports System.Collections.Generic
Module Example
Public Sub Main()
' Get an array of n random integers.
Dim values() As Integer = GetArray(50, 0, 1000)
Dim lBound As Integer = 300
Dim uBound As Integer = 600
Dim matchedItems() As Integer = Array.FindAll(values,
Function(x) x >= lBound And x <= uBound)
For ctr As Integer = 0 To matchedItems.Length - 1
Console.Write("{0} ", matchedItems(ctr))
If (ctr + 1) Mod 12 = 0 Then Console.WriteLine()
Next
End Sub
Private Function GetArray(n As Integer, lower As Integer,
upper As Integer) As Integer()
Dim rnd As New Random()
Dim list As New List(Of Integer)
For ctr As Integer = 1 To n
list.Add(rnd.Next(lower, upper + 1))
Next
Return list.ToArray()
End Function
End Module
' The example displays output similar to the following:
' 542 398 356 351 348 301 562 599 575 400 569 306
' 535 416 393 385
Poniższy przykład kodu przedstawia Findmetody ogólne , FindLasti FindAll . Tworzona jest tablica ciągów zawierająca 8 nazw dinozaurów, przy czym dwie z nich (w pozycjach 1 i 5) kończą się na „saurus”. Przykładowy kod definiuje również metodę predykatu wyszukiwania o nazwie EndsWithSaurus
, która akceptuje parametr ciągu i zwraca wartość logiczną wskazującą, czy ciąg wejściowy kończy się na "saurus".
Metoda Find ogólna przechodzi przez tablicę od początku, przekazując każdy element z kolei do EndsWithSaurus
metody . Wyszukiwanie zatrzymuje się, gdy EndsWithSaurus
metoda zwraca true
element "Amargasaurus".
Uwaga
W języku C#, F# i Visual Basic nie jest konieczne jawne utworzenie delegata Predicate<string>
(Predicate(Of String)
w Visual Basic). Te języki wnioskują o poprawnym delegacie z kontekstu, a następnie są tworzone automatycznie.
Metoda FindLast ogólna służy do wyszukiwania tablicy wstecz od końca. Znajduje element „Dilophosaurus” w pozycji 5. Metoda FindAll ogólna służy do zwracania tablicy zawierającej wszystkie elementy kończące się ciągiem "saurus". Elementy są wyświetlane.
Przykładowy kod demonstruje Exists również metody i TrueForAll ogólne.
using namespace System;
public ref class DinoDiscoverySet
{
public:
static void Main()
{
array<String^>^ dinosaurs =
{
"Compsognathus", "Amargasaurus", "Oviraptor",
"Velociraptor", "Deinonychus", "Dilophosaurus",
"Gallimimus", "Triceratops"
};
DinoDiscoverySet^ GoMesozoic = gcnew DinoDiscoverySet(dinosaurs);
GoMesozoic->DiscoverAll();
GoMesozoic->DiscoverByEnding("saurus");
}
DinoDiscoverySet(array<String^>^ items)
{
dinosaurs = items;
}
void DiscoverAll()
{
Console::WriteLine();
for each(String^ dinosaur in dinosaurs)
{
Console::WriteLine(dinosaur);
}
}
void DiscoverByEnding(String^ Ending)
{
Predicate<String^>^ dinoType;
if (Ending->ToLower() == "raptor")
{
dinoType =
gcnew Predicate<String^>(&DinoDiscoverySet::EndsWithRaptor);
}
else if (Ending->ToLower() == "tops")
{
dinoType =
gcnew Predicate<String^>(&DinoDiscoverySet::EndsWithTops);
}
else if (Ending->ToLower() == "saurus")
{
dinoType =
gcnew Predicate<String^>(&DinoDiscoverySet::EndsWithSaurus);
}
else
{
dinoType =
gcnew Predicate<String^>(&DinoDiscoverySet::EndsWithSaurus);
}
Console::WriteLine(
"\nArray::Exists(dinosaurs, \"{0}\"): {1}",
Ending,
Array::Exists(dinosaurs, dinoType));
Console::WriteLine(
"\nArray::TrueForAll(dinosaurs, \"{0}\"): {1}",
Ending,
Array::TrueForAll(dinosaurs, dinoType));
Console::WriteLine(
"\nArray::Find(dinosaurs, \"{0}\"): {1}",
Ending,
Array::Find(dinosaurs, dinoType));
Console::WriteLine(
"\nArray::FindLast(dinosaurs, \"{0}\"): {1}",
Ending,
Array::FindLast(dinosaurs, dinoType));
Console::WriteLine(
"\nArray::FindAll(dinosaurs, \"{0}\"):", Ending);
array<String^>^ subArray =
Array::FindAll(dinosaurs, dinoType);
for each(String^ dinosaur in subArray)
{
Console::WriteLine(dinosaur);
}
}
private:
array<String^>^ dinosaurs;
// Search predicate returns true if a string ends in "saurus".
static bool EndsWithSaurus(String^ s)
{
if ((s->Length > 5) &&
(s->Substring(s->Length - 6)->ToLower() == "saurus"))
{
return true;
}
else
{
return false;
}
}
// Search predicate returns true if a string ends in "raptor".
static bool EndsWithRaptor(String^ s)
{
if ((s->Length > 5) &&
(s->Substring(s->Length - 6)->ToLower() == "raptor"))
{
return true;
}
else
{
return false;
}
}
// Search predicate returns true if a string ends in "tops".
static bool EndsWithTops(String^ s)
{
if ((s->Length > 3) &&
(s->Substring(s->Length - 4)->ToLower() == "tops"))
{
return true;
}
else
{
return false;
}
}
};
int main()
{
DinoDiscoverySet::Main();
}
/* This code example produces the following output:
Compsognathus
Amargasaurus
Oviraptor
Velociraptor
Deinonychus
Dilophosaurus
Gallimimus
Triceratops
Array.Exists(dinosaurs, "saurus"): True
Array.TrueForAll(dinosaurs, "saurus"): False
Array.Find(dinosaurs, "saurus"): Amargasaurus
Array.FindLast(dinosaurs, "saurus"): Dilophosaurus
Array.FindAll(dinosaurs, "saurus"):
Amargasaurus
Dilophosaurus
*/
using System;
public class DinoDiscoverySet
{
public static void Main()
{
string[] dinosaurs =
{
"Compsognathus", "Amargasaurus", "Oviraptor",
"Velociraptor", "Deinonychus", "Dilophosaurus",
"Gallimimus", "Triceratops"
};
DinoDiscoverySet GoMesozoic = new DinoDiscoverySet(dinosaurs);
GoMesozoic.DiscoverAll();
GoMesozoic.DiscoverByEnding("saurus");
}
private string[] dinosaurs;
public DinoDiscoverySet(string[] items)
{
dinosaurs = items;
}
public void DiscoverAll()
{
Console.WriteLine();
foreach(string dinosaur in dinosaurs)
{
Console.WriteLine(dinosaur);
}
}
public void DiscoverByEnding(string Ending)
{
Predicate<string> dinoType;
switch (Ending.ToLower())
{
case "raptor":
dinoType = EndsWithRaptor;
break;
case "tops":
dinoType = EndsWithTops;
break;
case "saurus":
default:
dinoType = EndsWithSaurus;
break;
}
Console.WriteLine(
"\nArray.Exists(dinosaurs, \"{0}\"): {1}",
Ending,
Array.Exists(dinosaurs, dinoType));
Console.WriteLine(
"\nArray.TrueForAll(dinosaurs, \"{0}\"): {1}",
Ending,
Array.TrueForAll(dinosaurs, dinoType));
Console.WriteLine(
"\nArray.Find(dinosaurs, \"{0}\"): {1}",
Ending,
Array.Find(dinosaurs, dinoType));
Console.WriteLine(
"\nArray.FindLast(dinosaurs, \"{0}\"): {1}",
Ending,
Array.FindLast(dinosaurs, dinoType));
Console.WriteLine(
"\nArray.FindAll(dinosaurs, \"{0}\"):", Ending);
string[] subArray =
Array.FindAll(dinosaurs, dinoType);
foreach(string dinosaur in subArray)
{
Console.WriteLine(dinosaur);
}
}
// Search predicate returns true if a string ends in "saurus".
private bool EndsWithSaurus(string s)
{
if ((s.Length > 5) &&
(s.Substring(s.Length - 6).ToLower() == "saurus"))
{
return true;
}
else
{
return false;
}
}
// Search predicate returns true if a string ends in "raptor".
private bool EndsWithRaptor(String s)
{
if ((s.Length > 5) &&
(s.Substring(s.Length - 6).ToLower() == "raptor"))
{
return true;
}
else
{
return false;
}
}
// Search predicate returns true if a string ends in "tops".
private bool EndsWithTops(String s)
{
if ((s.Length > 3) &&
(s.Substring(s.Length - 4).ToLower() == "tops"))
{
return true;
}
else
{
return false;
}
}
}
/* This code example produces the following output:
Compsognathus
Amargasaurus
Oviraptor
Velociraptor
Deinonychus
Dilophosaurus
Gallimimus
Triceratops
Array.Exists(dinosaurs, "saurus"): True
Array.TrueForAll(dinosaurs, "saurus"): False
Array.Find(dinosaurs, "saurus"): Amargasaurus
Array.FindLast(dinosaurs, "saurus"): Dilophosaurus
Array.FindAll(dinosaurs, "saurus"):
Amargasaurus
Dilophosaurus
*/
open System
// Search predicate returns true if a string ends in "saurus".
let endsWithSaurus (s: string) =
s.Length > 5 && s.Substring(s.Length - 6).ToLower() = "saurus"
// Search predicate returns true if a string ends in "raptor".
let endsWithRaptor (s: string) =
s.Length > 5 && s.Substring(s.Length - 6).ToLower() = "raptor"
// Search predicate returns true if a string ends in "tops".
let endsWithTops (s: string) =
s.Length > 3 && s.Substring(s.Length - 4).ToLower() = "tops"
type DinoDiscoverySet =
{ Dinosaurs: string [] }
member this.DiscoverAll() =
printfn ""
for dino in this.Dinosaurs do
printfn $"{dino}"
member this.DiscoverByEnding(ending: string) =
let dinoType =
match ending.ToLower() with
| "raptor" -> endsWithRaptor
| "tops" -> endsWithTops
| "saurus" | _ -> endsWithSaurus
Array.Exists(this.Dinosaurs, dinoType)
|> printfn "\nArray.Exists(dinosaurs, \"%s\"): %b" ending
Array.TrueForAll(this.Dinosaurs, dinoType)
|> printfn "\nArray.TrueForAll(dinosaurs, \"%s\"): %b" ending
Array.Find(this.Dinosaurs, dinoType)
|> printfn "\nArray.Find(dinosaurs, \"%s\"): %s" ending
Array.FindLast(this.Dinosaurs, dinoType)
|> printfn "\nArray.FindLast(dinosaurs, \"%s\"): %s" ending
printfn $"\nArray.FindAll(dinosaurs, \"{ending}\"):"
for dinosaur in Array.FindAll(this.Dinosaurs, dinoType) do
printfn $"{dinosaur}"
let dinosaurs =
[| "Compsognathus"; "Amargasaurus"; "Oviraptor"
"Velociraptor"; "Deinonychus"; "Dilophosaurus"
"Gallimimus"; "Triceratops" |]
let goMesozoic = { Dinosaurs = dinosaurs }
goMesozoic.DiscoverAll()
goMesozoic.DiscoverByEnding "saurus"
// This code example produces the following output:
// Compsognathus
// Amargasaurus
// Oviraptor
// Velociraptor
// Deinonychus
// Dilophosaurus
// Gallimimus
// Triceratops
//
// Array.Exists(dinosaurs, "saurus"): true
//
// Array.TrueForAll(dinosaurs, "saurus"): false
//
// Array.Find(dinosaurs, "saurus"): Amargasaurus
//
// Array.FindLast(dinosaurs, "saurus"): Dilophosaurus
//
// Array.FindAll(dinosaurs, "saurus"):
// Amargasaurus
// Dilophosaurus
Public Class DinoDiscoverySet
Public Shared Sub Main()
Dim dinosaurs() As String = { "Compsognathus", _
"Amargasaurus", "Oviraptor", "Velociraptor", _
"Deinonychus", "Dilophosaurus", "Gallimimus", _
"Triceratops" }
Dim GoMesozoic As New DinoDiscoverySet(dinosaurs)
GoMesozoic.DiscoverAll()
GoMesozoic.DiscoverByEnding("saurus")
End Sub
Private dinosaurs As String()
Public Sub New(items() As String)
dinosaurs = items
End Sub
Public Sub DiscoverAll()
Console.WriteLine()
For Each dinosaur As String In dinosaurs
Console.WriteLine(dinosaur)
Next dinosaur
End Sub
Public Sub DiscoverByEnding(Ending As String)
Dim dinoType As Predicate(Of String)
Select Case Ending.ToLower()
Case "raptor"
dinoType = AddressOf EndsWithRaptor
Case "tops"
dinoType = AddressOf EndsWithTops
Case "saurus"
dinoType = AddressOf EndsWithSaurus
Case Else
dinoType = AddressOf EndsWithSaurus
End Select
Console.WriteLine(Environment.NewLine + _
"Array.Exists(dinosaurs, ""{0}""): {1}", _
Ending, _
Array.Exists(dinosaurs, dinoType))
Console.WriteLine(Environment.NewLine + _
"Array.TrueForAll(dinosaurs, ""{0}""): {1}", _
Ending, _
Array.TrueForAll(dinosaurs, dinoType))
Console.WriteLine(Environment.NewLine + _
"Array.Find(dinosaurs, ""{0}""): {1}", _
Ending, _
Array.Find(dinosaurs, dinoType))
Console.WriteLine(Environment.NewLine + _
"Array.FindLast(dinosaurs, ""{0}""): {1}", _
Ending, _
Array.FindLast(dinosaurs, dinoType))
Console.WriteLine(Environment.NewLine + _
"Array.FindAll(dinosaurs, ""{0}""):", Ending)
Dim subArray() As String = _
Array.FindAll(dinosaurs, dinoType)
For Each dinosaur As String In subArray
Console.WriteLine(dinosaur)
Next dinosaur
End Sub
' Search predicate returns true if a string ends in "saurus".
Private Function EndsWithSaurus(s As String) As Boolean
' AndAlso prevents evaluation of the second Boolean
' expression if the string is so short that an error
' would occur.
If (s.Length > 5) AndAlso _
(s.ToLower().EndsWith("saurus")) Then
Return True
Else
Return False
End If
End Function
' Search predicate returns true if a string ends in "raptor".
Private Function EndsWithRaptor(s As String) As Boolean
' AndAlso prevents evaluation of the second Boolean
' expression if the string is so short that an error
' would occur.
If (s.Length > 5) AndAlso _
(s.ToLower().EndsWith("raptor")) Then
Return True
Else
Return False
End If
End Function
' Search predicate returns true if a string ends in "tops".
Private Function EndsWithTops(s As String) As Boolean
' AndAlso prevents evaluation of the second Boolean
' expression if the string is so short that an error
' would occur.
If (s.Length > 3) AndAlso _
(s.ToLower().EndsWith("tops")) Then
Return True
Else
Return False
End If
End Function
End Class
' This code example produces the following output:
'
' Compsognathus
' Amargasaurus
' Oviraptor
' Velociraptor
' Deinonychus
' Dilophosaurus
' Gallimimus
' Triceratops
'
' Array.Exists(dinosaurs, "saurus"): True
'
' Array.TrueForAll(dinosaurs, "saurus"): False
'
' Array.Find(dinosaurs, "saurus"): Amargasaurus
'
' Array.FindLast(dinosaurs, "saurus"): Dilophosaurus
'
' Array.FindAll(dinosaurs, "saurus"):
' Amargasaurus
' Dilophosaurus
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 elementu array
są indywidualnie przekazywane do Predicate<T>elementu , a elementy zgodne z warunkami są zapisywane w zwracanej tablicy.
Ta metoda jest operacją O(n
), gdzie n
jest operacją Length typu array
.
W języku F# można zamiast tego użyć funkcji Array.filter .