Нехитрые советы для пользователей ПК

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();

Если пользователей не найдено, будет возвращено значение по умолчанию лежащего в основе типа.

4. IComparer для сортировки

Вам больше не нужно писать сложные классы 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);

5. Не используйте циклы для инициализации массивов

Не следует использовать циклы для инициализации массивов. Все мы делали это, чтобы написать быстрый код для тестирования. Теперь это можно заменить методом 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();

6. Замена двух аналогичных циклов конкатенацией

Если вам нужно в коде пройти по двум массивам, аналогичным по своей природе, можете использовать метод расширения 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();

}

8. Ключевое слово let

Ключевое слово 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

};

9. RegEx + LINQ?

Запросы 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. Дело в том, что они