Поиск…


замечания

Версия C # 3.0 была выпущена как часть .Net версии 3.5. Многие из функций, добавленных в эту версию, поддерживались LINQ (языковые INtegrated Queries).

Список дополнительных функций:

  • LINQ
  • Лямбда-выражения
  • Методы расширения
  • Анонимные типы
  • Неявно типизированные переменные
  • Инициализаторы объектов и коллекций
  • Автоматически реализованные свойства
  • Деревья выражений

Неявно введенные переменные (var)

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

var squaredNumber = 10 * 10;
var squaredNumberDouble = 10.0 * 10.0;
var builder = new StringBuilder();
var anonymousObject = new
{ 
    One = SquaredNumber,
    Two = SquaredNumberDouble,
    Three = Builder
}

Типы вышеперечисленных переменных - это int , double , StringBuilder и анонимный тип соответственно.

Важно отметить, что переменная var не является динамически типизированной. SquaredNumber = Builder недействителен, так как вы пытаетесь установить int в экземпляр StringBuilder

Языковые интегрированные запросы (LINQ)

//Example 1
int[] array = { 1, 5, 2, 10, 7 };

// Select squares of all odd numbers in the array sorted in descending order
IEnumerable<int> query = from x in array
                         where x % 2 == 1
                         orderby x descending
                         select x * x;
// Result: 49, 25, 1

Пример из статьи в Википедии на C # 3.0, подраздел LINQ

В примере 1 используется синтаксис запроса, который был спроектирован так, чтобы выглядеть аналогично SQL-запросам.

//Example 2
IEnumerable<int> query = array.Where(x => x % 2 == 1)
    .OrderByDescending(x => x)
    .Select(x => x * x);
// Result: 49, 25, 1 using 'array' as defined in previous example

Пример из статьи в Википедии на C # 3.0, подраздел LINQ

В примере 2 используется синтаксис метода для достижения того же результата, что и в примере 1.

Важно отметить, что в C # синтаксис запроса LINQ представляет собой синтаксический сахар для синтаксиса метода LINQ. Компилятор переводит запросы в вызовы методов во время компиляции. Некоторые запросы должны быть выражены в синтаксисе метода. Из MSDN - «Например, вы должны использовать вызов метода для выражения запроса, который извлекает количество элементов, которые соответствуют указанному условию».

Lambda expresions

Lambda Expresions - это расширение анонимных методов, которые допускают неявно типизированные параметры и возвращаемые значения. Их синтаксис менее подробный, чем анонимный, и следует за функциональным стилем программирования.

using System;
using System.Collections.Generic;
using System.Linq;
                    
public class Program
{
    public static void Main()
    {
        var numberList = new List<int> {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        var sumOfSquares = numberList.Select( number => number * number )
            .Aggregate( (int first, int second) => { return first + second; } );
        Console.WriteLine( sumOfSquares );
    }
}

Вышеприведенный код выводит сумму квадратов от 1 до 10 на консоль.

Первое лямбда-выражение квадратизирует числа в списке. Поскольку существует только одна скобка параметра, ее можно опустить. Вы можете включить скобки, если хотите:

.Select( (number) => number * number);

или явно введите параметр, но затем требуются скобки:

.Select( (int number) => number * number);

Тело лямбда является выражением и имеет неявное возвращение. Вы можете использовать тело оператора, если хотите. Это полезно для более сложных лямбдов.

.Select( number => { return number * number; } );

Метод select возвращает новый IEnumerable с вычисленными значениями.

Второе лямбда-выражение суммирует числа в списке, возвращаемом методом select. Скобки необходимы, поскольку существует несколько параметров. Типы параметров явно напечатаны, но это необязательно. Следующий метод эквивалентен.

.Aggregate( (first, second) => { return first + second; } );

Как и этот:

.Aggregate( (int first, int second) => first + second );

Анонимные типы

Анонимные типы предоставляют удобный способ инкапсулировать набор свойств только для чтения в один объект без необходимости явно определять тип в первую очередь. Имя типа генерируется компилятором и не доступно на уровне исходного кода. Тип каждого свойства определяется компилятором.

Вы можете создавать анонимные типы, используя new ключевое слово, за которым следует фигурная скобка ( { ) . Внутри фигурных фигурных скобок вы можете определить свойства, подобные приведенному ниже.

var v = new { Amount = 108, Message = "Hello" };

Также возможно создать массив анонимных типов. См. Следующий код:

var a = new[] { 
    new { 
        Fruit = "Apple", 
        Color = "Red" 
    },
    new {
        Fruit = "Banana",
        Color = "Yellow"
    }
};

Или используйте его с запросами LINQ:

var productQuery = from prod in products
                   select new { prod.Color, prod.Price };


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow