Прочитать на английском

Поделиться через


Array.Exists<T>(T[], Predicate<T>) Метод

Определение

Определяет, содержит ли заданный массив элементы, удовлетворяющие условиям указанного предиката.

public static bool Exists<T> (T[] array, Predicate<T> match);

Параметры типа

T

Тип элементов массива.

Параметры

array
T[]

Одномерный массив Array, индексация которого начинается с нуля и в котором нужно выполнить поиск.

match
Predicate<T>

Объект Predicate<T>, определяющий условия поиска элементов.

Возвращаемое значение

Boolean

Значение true, если массив array содержит один или несколько элементов, удовлетворяющих условиям указанного предиката; в противном случае — значение false.

Исключения

array имеет значение null.

-или-

match имеет значение null.

Примеры

В следующем примере указываются условия соответствия для Exists метода с помощью лямбда-выражений, чтобы проверить, начинается ли планета с заданной буквы или находится ли планета в заданном массиве.

using System;

namespace Example
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] planets = { "Mercury", "Venus",
                "Earth", "Mars", "Jupiter",
                "Saturn", "Uranus", "Neptune" };

            Console.WriteLine("One or more planets begin with 'M': {0}",
                Array.Exists(planets, element => element.StartsWith("M")));

            Console.WriteLine("One or more planets begin with 'T': {0}",
                Array.Exists(planets, element => element.StartsWith("T")));

            Console.WriteLine("Is Pluto one of the planets? {0}",
                Array.Exists(planets, element => element == "Pluto"));
        }
    }
}
// The example displays the following output:
//       One or more planets begin with 'M': True
//       One or more planets begin with 'T': False
//       Is Pluto one of the planets? False

В следующем примере метод используется Exists для указания того, начинаются ли имена в строковом массиве с указанного символа. В примере создается экземпляр StringSearcher объекта путем передачи строки для поиска в конструктор класса. Метод StringSearcher.StartsWith имеет ту же сигнатуру, что и Predicate<T> делегат. При вызове Exists метода каждый элемент массива передается делегату, пока он не вернет или не переитерирует true все элементы в массиве.

using System;

public class Example
{
   public static void Main()
   {
      String[] names = { "Adam", "Adel", "Bridgette", "Carla",
                         "Charles", "Daniel", "Elaine", "Frances",
                         "George", "Gillian", "Henry", "Irving",
                         "James", "Janae", "Lawrence", "Miguel",
                         "Nicole", "Oliver", "Paula", "Robert",
                         "Stephen", "Thomas", "Vanessa",
                         "Veronica", "Wilberforce" };
      Char[] charsToFind = { 'A', 'K', 'W', 'Z' };

      foreach (var charToFind in charsToFind)
         Console.WriteLine("One or more names begin with '{0}': {1}",
                           charToFind,
                           Array.Exists(names, (new StringSearcher(charToFind)).StartsWith));
   }
}

public class StringSearcher
{
   char firstChar;

   public StringSearcher(char firstChar)
   {
      this.firstChar = char.ToUpper(firstChar);
   }

   public bool StartsWith(string s)
   {
      if (string.IsNullOrEmpty(s)) return false;

      if(s.Substring(0, 1).ToUpper() == firstChar.ToString())
         return true;
      else
         return false;
   }
}
// The example displays the following output:
//       One or more names begin with 'A': True
//       One or more names begin with 'K': False
//       One or more names begin with 'W': True
//       One or more names begin with 'Z': False

Можно также использовать лямбда-выражение, а не явно определять метод, сигнатура которого соответствует сигнатуре делегата. В следующем примере класс и его StartsWith метод заменяются StringSearcher лямбда-выражением.

using System;

public class Example
{
   public static void Main()
   {
      String[] names = { "Adam", "Adel", "Bridgette", "Carla",
                         "Charles", "Daniel", "Elaine", "Frances",
                         "George", "Gillian", "Henry", "Irving",
                         "James", "Janae", "Lawrence", "Miguel",
                         "Nicole", "Oliver", "Paula", "Robert",
                         "Stephen", "Thomas", "Vanessa",
                         "Veronica", "Wilberforce" };
      Char[] charsToFind = { 'A', 'K', 'W', 'Z' };

      foreach (var charToFind in charsToFind)
         Console.WriteLine("One or more names begin with '{0}': {1}",
                           charToFind,
                           Array.Exists(names,
                                        s => { if (string.IsNullOrEmpty(s))
                                                  return false;

                                               if (s.Substring(0, 1).ToUpper() == charToFind.ToString())
                                                  return true;
                                               else
                                                  return false;
                                             } ));
   }
}
// The example displays the following output:
//       One or more names begin with 'A': True
//       One or more names begin with 'K': False
//       One or more names begin with 'W': True
//       One or more names begin with 'Z': False

Комментарии

Это Predicate<T> делегат метода, который возвращает true , если объект, переданный ему, соответствует условиям, определенным в делегате. Элементы array передаются в отдельные Predicate<T>элементы, а обработка останавливается при обнаружении совпадения.

Примечание

В C# и Visual Basic не требуется явно создавать Predicate<T> делегат. Эти языки определяют правильный делегат из контекста и создают его автоматически. В F# функции и лямбда-выражения неявно преобразуются.

Этот метод является операцией O(n), где n находится Length .array

Применяется к

См. также раздел