Características de C# compatibles con LINQ
La siguiente sección presenta las nuevas construcciones de lenguaje incluidas en C# 3.0. Aunque estas nuevas características se usan hasta cierto punto con consultas LINQ, no se limitan a LINQ y se pueden usar en cualquier contexto en las que se consideren de utilidad.
Expresiones de consulta
Las expresiones de consulta usan una sintaxis declarativa similar a SQL o XQuery para consultar colecciones de IEnumerable. En tiempo de compilación, la sintaxis de consulta se convierte en llamadas de método a la implementación de un proveedor de LINQ de los métodos de extensión de operador de consulta estándar. Las aplicaciones controlan los operadores de consulta estándar que están en el ámbito al especificar el espacio de nombres adecuado con una directiva using. La siguiente expresión de consulta toma una matriz de cadenas, las agrupa por el primer carácter de la cadena y ordena los grupos.
var query = from str in stringArray
group str by str[0] into stringGroup
orderby stringGroup.Key
select stringGroup;
Para obtener más información, vea Expresiones de consulta LINQ.
Variables con asignación implícita de tipos (var)
En lugar de especificar explícitamente un tipo al declarar e inicializar una variable, se puede usar el modificador var para indicar al compilador que deduzca y asigne el tipo, como se muestra aquí:
var number = 5;
var name = "Virginia";
var query = from str in stringArray
where str[0] == 'm'
select str;
Las variables declaradas como var son tan fuertemente tipadas como las variables cuyo tipo se especifica explícitamente. El uso de var hace posible crear tipos anónimos, pero solo se puede usar para variables locales. También se pueden declarar matrices con asignación implícita de tipos.
Para más información, vea Variables locales con asignación implícita de tipos.
Inicializadores de objeto y colección
Los inicializadores de objeto y colección permiten inicializar objetos sin llamar explícitamente a un constructor para el objeto. Los inicializadores normalmente se usan en expresiones de consulta cuando proyectan los datos de origen en un nuevo tipo de datos. Suponiendo que hay una clase denominada Customer con las propiedades públicas Name y Phone, el inicializador de objeto se puede usar como en el código siguiente:
var cust = new Customer { Name = "Mike", Phone = "555-1212" };
Continuando con nuestra clase Customer, suponga que hay un origen de datos denominado IncomingOrders y que para cada pedido con un OrderSize grande, nos gustaría crear un nuevo Customer basado en ese orden. Se pueden ejecutar una consulta LINQ en este origen de datos y usar la inicialización de objetos para rellenar una colección:
var newLargeOrderCustomers = from o in IncomingOrders
where o.OrderSize > 5
select new Customer { Name = o.Name, Phone = o.Phone };
El origen de datos puede tener más propiedades ocultas en el montón que la clase Customer, como OrderSize, pero con la inicialización de objetos, los datos devueltos por la consulta se moldean en el tipo de datos deseado; elegimos los datos que son relevantes para nuestra clase. Como resultado, ahora tenemos un IEnumerable relleno con el nuevo Customer que queríamos. Lo anterior también se puede escribir en la sintaxis de método de LINQ:
var newLargeOrderCustomers = IncomingOrders.Where(x => x.OrderSize > 5).Select(y => new Customer { Name = y.Name, Phone = y.Phone });
Para obtener más información, consulte:
Tipos anónimos
Un tipo anónimo se construye por el compilador y el nombre del tipo solo está disponible para el compilador. Los tipos anónimos son una manera cómoda de agrupar un conjunto de propiedades temporalmente en un resultado de consulta sin tener que definir un tipo con nombre independiente. Los tipos anónimos se inicializan con una nueva expresión y un inicializador de objeto, como se muestra aquí:
select new {name = cust.Name, phone = cust.Phone};
Para obtener más información, vea Tipos anónimos.
Métodos de extensión.
Un método de extensión es un método estático que se puede asociar con un tipo, por lo que puede llamarse como si fuera un método de instancia en el tipo. Esta característica permite, en efecto, "agregar" nuevos métodos a los tipos existentes sin tener que modificarlos realmente. Los operadores de consulta estándar son un conjunto de métodos de extensión que proporcionan funciones de consultas LINQ para cualquier tipo que implemente IEnumerable<T>.
Para obtener más información, vea Métodos de extensión.
Expresiones lambda
Una expresión lambda es una función insertada que usa el operador => para separar los parámetros de entrada del cuerpo de la función y que se puede convertir en tiempo de compilación en un delegado o un árbol de expresión. En la programación de LINQ, se encuentran expresiones lambda al realizar llamadas de método directas a los operadores de consulta estándar.
Para más información, consulte: