Упражнение 3. Расширение возможностей запроса



Присвоение переменной неявного типа

Явное кодирование IEnumerables из IGroupings может быстро стать трудоемким.

С помощью var можно более просто написать тот же запрос и цикл foreach. Ключевое слово var не приводит к изменению типов объектов; оно просто сообщает компилятору о необходимости определения типов.

1. Создайте новый запрос и обратите внимание на применение ключевого слова var:

var studentQuery3 =

from student in students

group student by student.Last[0];

 

foreach (var groupOfStudents in studentQuery3)

{

Console.WriteLine(groupOfStudents.Key);

foreach (var student in groupOfStudents)

{

    Console.WriteLine(" {0}, {1}",

        student.Last, student.First);

}

}

Упорядочение групп по значению их ключа

При выполнении предыдущего запроса группы были расположены не в алфавитном порядке.

2. Создайте новый запрос на основе предыдущего.

3. Укажите предложение orderby после предложения group.

4. Чтобы использовать предложение orderby, нужен идентификатор, служащий в качестве ссылки на группы, создаваемые предложением group. Предоставьте идентификатор с помощью ключевого слова into следующим образом:

       var studentQuery4 =

           from student in students

           group student by student.Last[0] into studentGroup

           orderby studentGroup.Key

           select studentGroup;

 

       foreach (var groupOfStudents in studentQuery4)

       {

           Console.WriteLine(groupOfStudents.Key);

           foreach (var student in groupOfStudents)

           {

               Console.WriteLine(" {0}, {1}",

                   student.Last, student.First);

           }

       }

5. Постройте и запустите приложение. При выполнении этого запроса группы будут отсортированы в алфавитном порядке.

Введение идентификаторов с помощью let

Ключевое слово let можно использовать для представления идентификатора для любого результата выражения в выражении запроса.

6. Создайте новый запрос:

var studentQuery5 =

from student in students

let totalScore = student.Scores[0] + student.Scores[1] +

   student.Scores[2] + student.Scores[3]

where totalScore / 4 < student.Scores[0]

select student.Last + " " + student.First;

 

foreach (string s in studentQuery5)

{

Console.WriteLine(s);

}

7. Исследуйте работу запроса. Обратите внимание, что идентификатор let применяется больше для удобства, хотя в других случаях он может повысить производительность, сохраняя результаты выражения так, чтобы оно не вычислялось повторно.

Использование синтаксиса метода в выражении запроса

Некоторые операции запроса могут быть выражены только с помощью синтаксиса методов.

8. Создайте новый запрос в котором вычисляется общий результат для каждого Student в исходной последовательности, а затем вызовите метод Average(), использующий результаты запроса для вычисления среднего балла класса. Обратите внимание на круглые скобки вокруг выражения запроса.

var studentQuery6 =

   from student in students

   let totalScore = student.Scores[0] + student.Scores[1] +

       student.Scores[2] + student.Scores[3]

   select totalScore;

 

double averageScore = studentQuery6.Average();

Console.WriteLine("Class average score = {0}", averageScore);

9. Постройте и запустите приложение.

Преобразование или проецирование в предложении select

Очень часто в запросах создаются последовательности, элементы которых отличаются от элементов в исходных последовательностях.

10. Создайте новый запрос, который возвращает последовательность строк (не Students):

       IEnumerable<string> studentQuery7 =

           from student in students

           where student.Last == "Garcia"

           select student.First;

11. В цикле foreach реализуйте перебор строк:

       Console.WriteLine("The Garcias in the class are:");

       foreach (string s in studentQuery7)

       {

           Console.WriteLine(s);

       }

12. Постройте и запустите приложение.

13. Создайте новый запрос на основе предыдущего.

14. Создайте последовательность Students, суммарный результат баллов которых больше среднего, вместе с их StudentID, используйте анонимный тип в инструкции select:

       var studentQuery8 =

           from student in students

           let x = student.Scores[0] + student.Scores[1] +

               student.Scores[2] + student.Scores[3]

           where x > averageScore

           select new { id = student.ID, score = x };

 

       foreach (var item in studentQuery8)

       {

           Console.WriteLine("Student ID: {0}, Score: {1}", item.id, item.score);

       }

15. Постройте и запустите приложение.


Дата добавления: 2019-02-26; просмотров: 146; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!