Давайте рассмотрим Generic List в элементах которого есть поле - дата. Допустим вы хотите отсортировать Generic List по полю дата, и хотите сделать это самым простым способом. Здесь написано как это сделать. Я добавил DropDownList с цельэ продемонстрировать результаты:
Недавно я работал над интересной проблемой, которая включала разделение коллекции строк на группы.
Мы имели большой набор e-mail-ов помещенную в коллекцию строк.
Задача была выбирать по 10 e-mail-ов за раз и отсылать их на обработку.
Здесь некий LINQ код, который может быть полезен, если у вас похожие требования - не использовать циклы для групировки.
var emailGrp = from i in Enumerable.Range(0, email.Length) group email[i] by i / 3;
foreach(var mail in emailGrp) SendEmail(string.Join(";", mail.ToArray()));
Console.ReadLine(); }
static void SendEmail(string email) { // Assuming that you have code for sending mails here Console.WriteLine(email); Console.WriteLine("--Batch Processed--"); }
Код выше использует оператор LINQ GroupBy() для выделения по 3 мыла за раз и отсылки их на обработку.
Помните, что group...by выражение переводится как вызов GroupBy.
Sub Main(ByVal args() As String) Dim arr() As String = { "3", "1", "6", "10", "5", "13" } For Each num In arr.OrderBy(Function(x) Integer.Parse(x)) Console.WriteLine(num) Next num Console.ReadLine() End Sub
Давайте рассмотрим пример метода Join в LINQ и C#.
Метод Join
выполняет внутреннее объединение над двумя последовательностями,
корреляция элементов этих последовательностей основывается на совпадении ключей.
Это называется объединение по равенству, потому как мы проверяем на равенсво, используя оператор равенства.
Каr вы знаете из реляционных баз данных, внутреннее объединение
сопоставляет каждому элементу первой последовательности, соответствующий элемент из второй последовательности.
Это если в сравнении участвуют уникальные ключи. Если соответствующего элемента второй последовательности нет, то
элемент первой последовательности также на попадает в выходную последовательность.
Метод Join() в LINQ работает точно также.
Мы будем использовать два класса Book и Order и используем Join над ними.
Здесь пример данных:
class Program { static void Main(string[] args) { List<Book> bookList = new List<Book> { new Book{BookID=1, BookNm="DevCurry.com Developer Tips"}, new Book{BookID=2, BookNm=".NET and COM for Newbies"}, new Book{BookID=3, BookNm="51 jQuery ASP.NET Recipes"}, new Book{BookID=4, BookNm="Motivational Gurus"}, new Book{BookID=5, BookNm="Spiritual Gurus"} };
List<Order> bookOrders = new List<Order>{ new Order{OrderID=1, BookID=1, PaymentMode="Cheque"}, new Order{OrderID=2, BookID=5, PaymentMode="Credit"}, new Order{OrderID=3, BookID=1, PaymentMode="Cash"}, new Order{OrderID=4, BookID=3, PaymentMode="Cheque"}, new Order{OrderID=5, BookID=3, PaymentMode="Cheque"}, new Order{OrderID=6, BookID=4, PaymentMode="Cash"} }; } }
public class Book { public int BookID { get; set; } public string BookNm { get; set; } }
public class Order { public int OrderID { get; set; } public int BookID { get; set; } public string PaymentMode { get; set; } }
А здесь пример кода, применяющего Join над коллекциями книг и заказов.
var orderForBooks = from bk in bookList join ordr in bookOrders on bk.BookID equals ordr.BookID select new { bk.BookID, Name = bk.BookNm, ordr.PaymentMode };
foreach (var item in orderForBooks) Console.WriteLine(item);
Console.ReadLine();
В коде показанном вверху для сравнения используется оператор равенства.
Результат операции помещаем в анонимный тип, который включает BookID, BookName, OrderPaymentMode.
var highest = from e in emp group e by e.DeptId into dptgrp let topsal = dptgrp.Max(x => x.salary) select new { Dept = dptgrp.Key, TopSal = dptgrp.First(y => y.Salary == topsal).EmpId, MaximumSalary = topsal };
Здесь небольшое пояснение. Сначала мы получаем максимальную зарплату используя
let topsal = dptgrp.Max(x => x.salary)
потом мы используем переменную topsal для сравнения ее с зарплатой текущего Employee в отделе и потом выбираем Empid
Вот и все что нужно, чтобы получить иды сотрудников с самой большой зарплатой в каждом департаменте.
Для печати результатов, просто используйте цикл и напечатайте значения - foreach(var a in highest){ }.