Параметры в Enumerable.Where - PullRequest
0 голосов
/ 09 мая 2020

Я хочу найти все записи, которые являются пустыми или ненулевыми. Я могу сделать это таким образом (пример кода):

public ICollection<Employees> SearchForPhoneNumberNull()
{
    return collection.Where(x => x.PhoneNumber == null);
}
public ICollection<Employees> SearchForPhoneNumberNotNull()
{
    return collection.Where(x => x.PhoneNumber != null);
}

Могу ли я каким-то образом соединить эти два метода и, например, отправить некоторую переменную, которая определит, что это != или ==?

Ответы [ 3 ]

2 голосов
/ 09 мая 2020

Конечно, вот так:

public ICollection<Employees> SearchForPhoneNumber(bool nullOnly)
{
    return collection.Where(x => nullOnly ? x.PhoneNumber == null : x.PhoneNumber != null);
}
0 голосов
/ 09 мая 2020

Чтобы одна функция обрабатывала как нулевые, так и ненулевые телефонные номера, я бы реализовал функцию расширения.

static class EmployeesExtensions
{
    public static ICollection<Employees> SearchForPhoneNumber(
        this ICollection<Employees> collection, 
        Func<Employees, bool> predicate)
    {
        return collection.Where(predicate).ToList();
    }
}

Здесь следует отметить несколько важных моментов.

  • Функции расширения должны быть в классе stati c (т.е. static class EmployeesExtensions

  • this ICollection<Employees> collection

    • Определяет тип объекта, для которого может быть вызвана функция расширения.
    • this позволяет использовать функцию как функцию расширения.
  • Func<Employees, bool> predicate
    • Позволяет передавать лямбда-выражение в функцию расширения.
      • Принимает объект «Сотрудники» в качестве параметра
      • Возвращает a bool (т. е. True / False).
    • Пример: e => e.PhoneNumber == null
    • передано .Where() по имени, predicate
  • .ToList() необходимо для преобразования IEnumerable<Employees> в ICollection<Employees>. Однако это приводит к принудительному вычислению создаваемого вами дерева выражений LINQ. Таким образом, вместо того, чтобы возвращать составное дерево выражений, он возвращает фактические Employees объекты.

Итак, теперь, когда у нас есть метод расширения, мы можем использовать его в программе.

class Program
{
    static void Main(string[] args)
    {
        var employees = CreateEmployeesCollection();

        Console.WriteLine("Employees with Phone Number");

        foreach (var e in employees.SearchForPhoneNumber(
            e => !string.IsNullOrEmpty(e.PhoneNumber)))
        {
            Console.WriteLine($"ID: {e.Id}; Name: {e.Name}; Phone: {e.PhoneNumber}");
        }

        Console.WriteLine();
        Console.WriteLine("Employees with No Phone Number");

        foreach (var e in employees.SearchForPhoneNumber(
            e => string.IsNullOrEmpty(e.PhoneNumber)))
        {
            Console.WriteLine($"ID: {e.Id}; Name: {e.Name}; Phone: null");
        }

        Console.WriteLine();
        Console.WriteLine("Employees with Phone Number in 312 Area Code");

        foreach (var e in employees.SearchForPhoneNumber(
            e => !string.IsNullOrEmpty(e.PhoneNumber)
            && e.PhoneNumber.StartsWith("312")))
        {
            Console.WriteLine($"ID: {e.Id}; Name: {e.Name}; Phone: {e.PhoneNumber}");
        }
    }

    private static ICollection<Employees> CreateEmployeesCollection()
    {
        var employees = new Collection<Employees>();

        employees.Add(new Employees { Id = 1, Name = "John Doe", PhoneNumber = null });
        employees.Add(new Employees { Id = 2, Name = "Jane Doe", PhoneNumber = "212-555-1212" });
        employees.Add(new Employees { Id = 3, Name = "Mike Smith", PhoneNumber = "312-555-1213" });
        employees.Add(new Employees { Id = 4, Name = "Mary Smith", PhoneNumber = "312-555-1214" });
        employees.Add(new Employees { Id = 5, Name = "Bob Jones", PhoneNumber = "214-555-1215" });
        employees.Add(new Employees { Id = 5, Name = "Beth Jones", PhoneNumber = null });

        return employees;
    }
}

Да, также, для этот экзамен Я предположил следующее определение класса сотрудников:

// File: Employees.cs
class Employees
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string PhoneNumber { get; set; }
}
0 голосов
/ 09 мая 2020

Вы можете использовать аргумент bool, чтобы проверить, должен ли номер телефона быть null или нет.

Также метод Where возвращает IEnumerable, нет явного обращения к ICollection , поэтому я изменил объявление метода

        public IEnumerable<Employees> SearchForPhoneNumber(bool isNull = true)
        {
            return collection.Where(x => isNull ? x.PhoneNumber == null : x.PhoneNumber != null);
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...