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


Практическое руководство. Динамическое определение фильтров предикатов во время выполнения (Руководство по программированию на C#)

В некоторых случаях только во время выполнения удается определить, сколько предикатов нужно применить к исходным элементам в предложении where. Одним из способов динамического определения нескольких фильтров предикатов является использование метода Contains, как показано в следующем примере. Пример состоит из двух частей. Сначала проект запускается посредством фильтрации по значениям, предоставленным в программе. Затем проект запускается повторно с использованием входных данных, предоставленных во время выполнения.

Фильтрация с помощью метода "Contains"

  1. Откройте в Visual Studio новое консольное приложение. Присвойте ему имя PredicateFilters.

  2. Скопируйте класс StudentClass из раздела Практическое руководство. Запрос коллекции объектов (Руководство по программированию на C#) и вставьте его в пространство имен PredicateFilters, вложив в класс Program. StudentClass предоставляет список объектов Student.

  3. Закомментируйте метод Main в StudentClass.

  4. Замените класс Program на следующий код.

    class DynamicPredicates : StudentClass
    {
        static void Main(string[] args)
        {
            string[] ids = { "111", "114", "112" };
    
            Console.WriteLine("Press any key to exit.");
            Console.ReadKey();
        }
    
        static void QueryByID(string[] ids)
        {
            var queryNames =
                from student in students
                let i = student.ID.ToString()
                where ids.Contains(i)
                select new { student.LastName, student.ID };
    
            foreach (var name in queryNames)
            {
                Console.WriteLine("{0}: {1}", name.LastName, name.ID);
            }
        }
    }
    
  5. Добавьте в метод Main в классе DynamicPredicates под объявлением ids следующую строку.

    QueryById(ids);
    
  6. Чтобы запустить проект, нажмите клавишу F5.

  7. В окне командной строки выводится следующий результат:

    Garcia: 114

    O'Donnell: 112

    Omelchenko: 111

  8. Следующим этапом является повторный запуск проекта, но с использованием входных данных, введенных во время выполнения, а не массива ids. В обозревателе решений щелкните правой кнопкой мыши PredicateFilters и выберите пункт Свойства.

  9. Перейдите на вкладку Отладка.

  10. В окне Аргументы командной строки введите значения 122, 117, 120 и 115, разделяя их пробелами: 122 117 120 115. После запуска проекта эти значения становятся элементами параметра args метода Main.

  11. Измените значение QueryByID(ids) на QueryByID(args) в методе Main.

  12. Чтобы запустить проект, нажмите клавишу F5.

  13. В окне командной строки выводится следующий результат:

    Adams: 120

    Feng: 117

    Garcia: 115

    Tucker: 122

Фильтрация с использованием оператора "switch"

  1. Оператор switch можно использовать для выбора предопределенных альтернативных запросов. В следующем примере studentQuery использует другое предложение where в зависимости от того, какой год обучения указан во время выполнения.

  2. Скопируйте следующий метод и вставьте его в класс DynamicPredicates.

    // To run this sample, first specify an integer value of 1 to 4 for the command
    // line. This number will be converted to a GradeLevel value that specifies which
    // set of students to query. 
    // Call the method: QueryByYear(args[0]);
    
    static void QueryByYear(string level)
    {
        GradeLevel year = (GradeLevel)Convert.ToInt32(level);
        IEnumerable<Student> studentQuery = null;
        switch (year)
        {
            case GradeLevel.FirstYear:
                studentQuery = from student in students
                               where student.Year == GradeLevel.FirstYear
                               select student;
                break;
            case GradeLevel.SecondYear:
                studentQuery = from student in students
                               where student.Year == GradeLevel.SecondYear
                               select student;
                break;
            case GradeLevel.ThirdYear:
                studentQuery = from student in students
                               where student.Year == GradeLevel.ThirdYear
                               select student;
                break;
            case GradeLevel.FourthYear:
                studentQuery = from student in students
                               where student.Year == GradeLevel.FourthYear
                               select student;
                break;
    
            default:
                break;
        }
        Console.WriteLine("The following students are at level {0}", year.ToString());
        foreach (Student name in studentQuery)
        {
            Console.WriteLine("{0}: {1}", name.LastName, name.ID);
        }
    }
    
  3. В окне Аргументы командной строки замените идентификационные номера из предыдущей процедуры на целочисленное значение между 1 и 4.

  4. В методе Main замените вызов QueryByID на следующий вызов, который передает первый элемент массива args в качестве аргумента: QueryByYear(args[0]).

  5. Чтобы запустить проект, нажмите клавишу F5.

Использование данного метода в своих приложениях

  • Настраивая данный метод для своего приложения, помните, что для LINQ требуется .NET Framework версии 3.5 или 4, а проект должен содержать ссылку на библиотеку System.Core.dll и директиву using для библиотеки System.Linq. Типы LINQ to SQL, LINQ to XML и LINQ to DataSet требуют дополнительных директив using и ссылок. Дополнительные сведения см. в разделе Практическое руководство. Создание проекта LINQ.

См. также

Ссылки

Предложение where (Справочник по C#)

Основные понятия

Выражения запросов LINQ (Руководство по программированию на C#)