Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
Item: System Shock 2
Item: Uncharted 2
Решение с использованием расширяющих методов
Применяемый ранее (и далее в главе) синтаксис LINQ называется выражениями запросов LINQ, которые представляют собой формат, похожий на SQL, но слегка отличающийся от него. Существует еще один синтаксис с расширяющими методами, который будет использоваться в большинстве примеров в настоящей книге. Создайте новый метод по имени
QueryOverStringsWithExtensionMethods()
static void QueryOverStringsWithExtensionMethods()
{
// Пусть имеется массив строк.
string[] currentVideoGames = {"Morrowind", "Uncharted 2",
"Fallout 3", "Daxter", "System Shock 2"};
// Построить выражение запроса для поиска
// в массиве элементов, содержащих пробелы.
<b> IEnumerable<string> subset =</b>
<b> currentVideoGames.Where(g => g.Contains(" "))</b>
<b> .OrderBy(g => g).Select(g => g);</b>
// Вывести результаты.
foreach (string s in subset)
{
Console.WriteLine("Item: {0}", s);
}
}
Код здесь тот же, что и в предыдущем методе, кроме строк, выделенных полужирным. В них демонстрируется применение синтаксиса расширяющих методов, в котором для определения операций внутри каждого метода используются лямбда-выражения. Например, лямбда-выражение в методе
Where()
v
Хотя результаты аналогичны (метод дает такой же вывод, как и предыдущий метод, использующий выражение запроса), вскоре вы увидите, что тип результирующего набора несколько отличается. В большинстве (если фактически не во всех) сценариях подобное отличие не приводит к каким-либо проблемам и форматы могут применяться взаимозаменяемо.
Решение без использования LINQ
Конечно, применение LINQ никогда не бывает обязательным. При желании идентичный результирующий набор можно получить без участия LINQ с помощью таких программных конструкций, как операторы
if
for
QueryOverStrings()
static void QueryOverStringsLongHand()
{
// Предположим, что имеется массив строк.
string[] currentVideoGames = {"Morrowind", "Uncharted 2",
"Fallout 3", "Daxter", "System Shock 2"};
string[] gamesWithSpaces = new string[5];
for (int i = 0; i < currentVideoGames.Length; i++)
{
if (currentVideoGames[i].Contains(" "))
{
gamesWithSpaces[i] = currentVideoGames[i];
}
}
// Отсортировать набор.
Array.Sort(gamesWithSpaces);
// Вывести результаты.
foreach (string s in gamesWithSpaces)
{
if( s != null)
{
Console.WriteLine("Item: {0}", s);
}
}
Console.WriteLine();
}
Несмотря на возможные пути улучшения метода
QueryOverStringsLongHand()
if/else
Выполнение рефлексии результирующего набора LINQ
А теперь определите в классе
Program
ReflectOverQueryResults()
System.Object
static void ReflectOverQueryResults(object resultSet,
string queryType = "Query Expressions")
{
Console.WriteLine($"***** Info about your query using {queryType} *****");
// Вывести тип результирующего набора
Console.WriteLine("resultSet is of type: {0}", resultSet.GetType().Name);
// Вывести местоположение результирующего набора
Console.WriteLine("resultSet location: {0}",
resultSet.GetType().Assembly.GetName().Name);
}