Вопрос по Курсу: "Параллельное программирование с использованием MS VisualStudia 2010". При компиляции Самостоятельного задания (одновременная отрисовка прямоугольников, эллипсов и выдача в текст-бокс случайного числа) среда предупреждает: suspend - устаревшая команда; примените monitor, mutex и т.п. Создаётся впечатление, что Задание создано в более поздней среде, чем VS 2010. |
Parallel LINQ (PLINQ)
Примеры LINQ - запросов
Работа с простыми массивами данных
В первом примере, используем LINQ-запрос для того, что бы из заданного массива выбрать диапазон чисел с условием, что элемент массива будет больше 1, но меньше 9 включительно:
static void Main(string[] args) { int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; var nums = from i in numbers where i > 1 && i <= 9 select i; foreach (var n in nums) { Console.Write(n + " "); } Console.ReadLine(); }
Рассмотрим подробнее строчку с LINQ-запросом:
var nums = from i in numbers where i > 1 && i <= 9 select i;
nums - это неявный тип переменной, которой присваивается результат выполнения LINQ -запроса; i - это переменная диапазона; numbers - источник данных.
Этот же LINQ - запрос (как и любой другой) можно реализовать с помощью лямбда-выражения:
var nums = numbers.Where(i => i > 1 && i <= 9);
Также, в фрагменте кода с оператором select, можно вызывать функцию или реализованный ранее метод, и тогда переменной nums - будет присвоен результат выполнения функции или метода. Как показано в примере ниже переменная nums будет содержать результаты работы функции Math.Sqrt которая вычисляет квадратный корень из массива numbers:
var nums = from i in numbers where i > 1 && i <= 9 select Math.Sqrt(i);
увеличить изображение
Рис. 11.3. Результат выполнения LINQ - запроса с использованием функции Math.Sqrt()
Работа с массивами и коллекциями классов
Также, с помощью LINQ - запросов можно обращаться к другим источникам данных, таким как типизированные списки List<T>, объекты, которых содержат простые экземпляры классов. В нашем случае - это объекты класса Employee:
public class Employee { public int id {get;set;} public string firstname { get; set; } public string lastname {get;set;} public double salary {get;set;} public static List<Employee> GetEmployees() { List<Employee> emp = new List<Employee> { new Employee { id = 1, firstname = "Иван", lastname = "Иванов",salary=3500 }, new Employee { id = 2, firstname = "Сергей", lastname = "Сидоров", salary = 1710 }, new Employee { id = 3, firstname = "Алексей", lastname = "Петренко", salary = 2115.3 }, new Employee { id = 4, firstname = "Александр", lastname = "Иванов", salary = 1411.1 } }; return (emp); } } static void Main(string[] args) { var employees = Employee.GetEmployees(); var employee = from i in employees where i.lastname=="Иванов" select i; foreach (var n in employee) { Console.WriteLine(n.id + " " + n.firstname +" "+n.lastname +" "+ n.salary); } Console.ReadLine(); }
В методе Main() получаем список сотрудников с помощью метода GetEmployees() который возвращает список сотрудников, содержащийся в типизированной коллекции List<Employee>. LINQ-запрос получает список сотрудников, у которых фамилия "Иванов" (Рис. 11.4)
увеличить изображение
Рис. 11.4. Результат выполнения LINQ - запроса с использованием объектов класса Employee