List adminUsers =
RetrieveUsersForAdminRole(RoleType.Admin);
User firstUser = null;
If (adminUsers != null) && (adminUsers.Count > 0)
{
firstUser = adminUsers[0];
Это можно заменить простым запросом LINQ:
List adminUsers =
RetrieveUsersForAdminRole(RoleType.Admin);
User firstUser = adminUsers.FirstOrDefault();
Если пользователей не найдено, будет возвращено значение по умолчанию лежащего в основе типа.
Вам больше не нужно писать сложные классы IComparer, чтобы сортировать данные. Теперь для упорядочения можно использовать метод OrderBy. Приведенный ниже пример запроса отличается краткостью: var filteredUsers = Users.Where(u => u.Active && u.AllowLogin && !u.Loggedln) .OrderBy( u => u.Name);
Функция OrderBy принимает параметр, используемый для сортировки. Если нужна множественная сортировка, нужно применить оператор ThenBy.
var filteredUsers = Users.Where(u => u.Active && u.AllowLogin && !u.Loggedln) .OrderBy( u => u.Name).ThenBy(u => u.Location);
Сортировать можно и в порядке убывания. В LINQ для этого есть оператор OrderByDescending.
var filteredUsers = Users.Where(u => u.Active && u.AllowLogin && !u.Loggedln) .OrderByDescending( u => u.Name) .ThenBy(u => u.Location);
Не следует использовать циклы для инициализации массивов. Все мы делали это, чтобы написать быстрый код для тестирования. Теперь это можно заменить методом System.Linq.Enuemerable.Range. int[] monthsInAYear = new int[12];
for (int counter = 0; counter < monthsInAYear.Length; counter++)
{
monthsInAYear[counter] = counter + 1;
}
В LINQ это займет одну строку кода:
int[] monthsInAYearByLINQ = System.Linq.Enumerable.Ranged(1, 12).ToArray();
Если вам нужно в коде пройти по двум массивам, аналогичным по своей природе, можете использовать метод расширения Concat, чтобы написать лаконичный код. Рассмотрим пример:
int[] firstArray =
System.Linq.Enumerable. Range(1, 12).ToArray(); int[] secondArray =
System. Linq. Enumerable. Range(13, 12).ToArrayO;
foreach (var fa in firstArray)
{
allElements.AppendLine(string.Format(«{0}», fa));
}
foreach (var sa in secondArray)
{
allElements.Append Line(string.Format(«{0}», sa));
}
А вот код, в котором задействован оператор Concat:
int[] firstArray =
System. Linq. Enumerable. Range(1, 12).ToArrayO; int[] secondArray =
System. Linq. Enumerable. Range(13, 12).ToArrayO;
foreach (var a in firstArray.Concat(secondArray))
{
allElements.AppendLine(string.Format(«{0}», a));
}
7. Избегайте преобразований
Преобразование — это методика, используемая для возвращения новой коллекции, получаемой за счет прохождения в цикле по другой коллекции и применения фильтра. Возьмем для примера текст, приведенный ниже. Здесь после прохождения в цикле по коллекции создается массив.
public Users[] FindUsers(RoleType r)
{
IEnumerable users = FindUsersQ;
List filteredUsers = new List();
foreach (User u in users)
{
filteredUsers.Add(new User {
FirstName = u.FirstName,
…
return filteredUsers.ToArray();
}
Вместо того чтобы создавать временный список и затем заполнять его значениями, можно воспользоваться методами LINQ Select и ToArray для возврата результатов.
public Users[] FindUsers(RoleType r)
{
return FindUsersQ .Select(user => new User {
FirstName = u.FirstName,
…
.Where(user => user.Role == r)
.ToArray();
}
Ключевое слово let позволяет создавать временные переменные в запросе LINQ, благодаря чему ваш Select становится проще читать и изменять. Вы можете предварительно определять переменные на определенном этапе запроса. Эти переменные затем могут быть использованы в остальной части запроса.
Например, следующий запрос вычисляет среднее значение дважды. Второе вычисление можно не
производить, если применить оператор let. Благодаря сокращению объема вычислений запрос будет работать быстрее.
var results= from store in Stores
where store.Sales.Average(s => s.Price) > 500 select new {
Name = store.Name, StoreAveragePrice =
store.Sales.Average(s => s.Price) };
Вот этот же фрагмент, использующий let:
var results= from store in Stores let AveragePrice =
store.Sales.Average(s => s.Price) where AveragePrice > 500
select new {
Name = store.Name,
StoreAveragePrice = AveragePrice
};
Запросы LINQ могут упростить работу, если вы применяете регулярные выражения. Посмотрите на следующий пример, в котором мы проходим по коллекции с использованием регулярного выражения.
Обратите внимание на то, что с отобранными при помощи RegEx результатами можно выполнять другие запросы LINQ.
List examinerStatements = new List();
examinerStatements.Add(«Mark was present.»);
examinerStatements.Add(«Julie was present.»);
examinerStatements.Add(«John was absent»);
System.Text.RegularExpressions.Regex myRegEx = new System.Text.RegularExpressions.Regex(«present»);
var presentStudents = examinerStatements .Where(statement =>
myRegEx.IsMatch(statement)).ToList();
foreach (var examinerStatement in presentStudents)
{
Наверное, вы знаете, что запросы LINQ нельзя осуществлять со списками ArrayList. Дело в том, что они