2009-02-04 21 views
20

Con LINQ, muchos problemas de programación se pueden resolver más fácilmente y en menos líneas de código.Tus consultas favoritas de LINQ-to-Objects

¿Cuáles son algunas de las mejores consultas del mundo real LINQ-to-Objects que has escrito?

(Mejor = simplicidad & elegancia en comparación con el enfoque imperativo C# 2.0).

+0

Una muy buena pregunta, pero creo que debería ser wikified. – GvS

Respuesta

0

¡Empezó y es increíble!

var myList = from list in myObjectList select list 
+0

Lo siento, no estoy entendiendo la idea. ¿Qué tiene de especial este ejemplo? – Matt

+0

@Matt hace 7 años que era bastante limpio. –

+0

@Matt porque era una forma realmente simple pero poderosa de iterar rápidamente de la lista. A partir de ahí, es fácil agregar cláusulas where, etc. para obtener _realmente_ algunos resultados sorprendentes. El código sería limpio y simple de leer. –

8

Filtrar elementos nulos en una lista.

var nonnull = somelist.Where(a => a != null); 

crear un diccionario donde la clave es el valor de una propiedad, y el valor es el número de veces que la propiedad aparece en la lista.

var countDictionary = somelist 
    .GroupBy(a => a.SomeProperty) 
    .ToDictionary(g => g.Key, g => g.Count()); 
+3

'somelist.Where (a => a! = Null)' es un poco menos eficiente que 'somelist.OfType ()' – Gabe

4

LINQ es simplemente la adición de algunos conceptos de programación funcional a C#/VB. Por lo tanto, sí, la mayoría de las cosas tienden a ser mucho más fáciles. C# 2.0 en realidad tenía algo de esto, vea los métodos de la Lista, por ejemplo. (Aunque, la sintaxis método anónimo en C# 2.0 era demasiado detallado.)

Aquí hay un pequeño ejemplo:

static readonly string badChars = "[email protected]#$%^&*()"; 
bool IsUserNameValid(string userName) { 
    return userName.Intersect(badChars).Any(); 
} 
1

Si usted tiene una lista (es decir List<Palette> palettes) que contiene los objetos que contiene otra lista (es decir Palette.Colors) y desee aplanar todos esos sub-listas en una sola:

List<Color> allColors = palettes.SelectMany(p => p.Colors); 
3

Ejemplo 1

R lista con los nombres de todas las instancias disponibles de SQL Server eturns dentro de la red local

private List<string> GetServerNames() 
{ 
    return SqlDataSourceEnumerator.Instance.GetDataSources().Rows. 
     Cast<DataRow>(). 
     Select 
     (
      row => row["ServerName"].ToString() + 
        (row["InstanceName"] != DBNull.Value ? "\\" + row["InstanceName"].ToString() : "") + 
        (row["Version"] != DBNull.Value ? " (" + row["Version"].ToString().Substring(0, 3) + ")" : "") 
     ). 
     OrderBy(s => s). 
     ToList(); 
} 

Ejemplo 2

nombre no Genera utilizado para el nuevo archivo de

private string NewName(string newNamePrefix, List<string> existingFileNames) 
{ 
    return newNamePrefix + 
     (existingFileNames. 
      Select 
      (
       n => 
       { 
        if (n.StartsWith(newNamePrefix)) 
        { 
         int i; 
         if (int.TryParse(n.Replace(newNamePrefix, ""), out i)) 
          return i; 
        } 

        return 0; 
       } 
      ). 
      OrderBy(i => i). 
      Last() + 1 
     ); 
} 
+0

¿Qué referencia necesita para el primer ejemplo? Lo probé en LinqPad pero falta una referencia de ensamblado. – Matt

2

tengo dos muy bien absurda, pero ejemplos elegantes que amo

public static IEnumerable<bool> Information(this byte x) 
{ 
    return Enumerable.Range(0, 8).Select(i => ((x >> i) & 1) == 1); 
} 

public static IEnumerable<bool> Information(this IEnumerable<byte> xs) 
{ 
    return xs.SelectMany(Information); 
} 

Aunque estos están encapsulados como operadores de consulta para que pueda volver a utilizarlos, p. para el análisis binario

var n = bytes.Information().Skip(3).Take(16).ToInt(); 
+0

Veo - es una función ToBits(). Bonito. –

+0

Sí; Prefiero el nombre Información ya que la unidad de información más pequeña es un poco. Aunque debería haber sido una propiedad de extensión, aún no los tenemos. –

2

Si usted tiene un Name=Value cadena delimitada, como "ID=2;Name=James;Age=32;" y quiere convertir esto en un diccionario de forma rápida, puede utilizar:

var dict = value.Split(new[] { ";" }, StringSplitOptions.RemoveEmptyEntries) 
    .Select(str => str.Split('=')) 
    .ToDictionary(pair => pair[0], pair => pair[1]); 
0

me gusta usar LINQ en el texto código cuando estoy portar:

Por ejemplo:

String.Join("\n", @"some VB6 code 
    that I could refactor automatically 
    if FindAndReplace were a bit more powerfully 
    And I don't want to refactor by hand".Split('\n').Trim().Select(line => 
    { 
     if(line.Contains("FindAndReplace") && !line.StartsWith("//")) 
     { 
      return line.Split(" ").Last(); 
     } 
     else 
     { 
      return String.Join("_", line.Split(" ").Take(3)); 
     } 
    }); 

Ya entendiste la idea.Linq me permite aplicar toda la potencia de C# a la transformación de texto. Normalmente lo uso cuando tengo un código en un idioma que quiero extraer y manipular de una manera compleja, tiro el texto solo en LinqPad y hago un "buscar-reemplazar" entre comillas, reemplazándolos con comillas dobles, luego Lo rodeo por @"..." y me pongo a trabajar. Normalmente puedo hacer transformaciones de código masivas en 30 segundos más o menos.

0

Mi favorito es el siguiente ejemplo LINQ para clasificar dinámicamente una tabla de SQL de la base de datos Northwind:

void Main() 
{ 

// Demonstrates dynamic ordering 

var SortExpression = "Total"; // choose ProductName or Total 
var sortAscending = true; // choose true for ascending, false for descending 

// the query to sort 
var data = (from pd in Products 
        join od in OrderDetails on pd.ProductID equals od.ProductID into DetailsByProduct 
        select new { ProductName = pd.ProductName, Total = DetailsByProduct.Count()}).ToList(); 

// the data source you can use for data binding      
var ds= (sortAscending) 
    ? data.OrderBy(x => x.GetType().GetProperty(SortExpression).GetValue(x, null)) 
    : data.OrderByDescending(x => x.GetType().GetProperty(SortExpression).GetValue(x, null)); 

ds.Dump(); 
} 

Le permite dinámicamente tipo solo es necesario especificar un campo en la variable SortExpression y un orden de clasificación en la variable sortAscending.

Al usar .Take(x) y .Skip(y) también puede implementar la búsqueda fácilmente.

Cuestiones relacionadas