2009-04-22 28 views

Respuesta

19
  • casi nada que ver con las colecciones es más fácil con LINQ a Objetos. Encuentro eso mucho más útil que LINQ to SQL.
  • Me he encariñado bastante con un framework que Marc Gravell y yo desarrollamos llamado Push LINQ (actualmente parte de MiscUtil, pero que probablemente se mude eventualmente a MoreLINQ). Esto es ideal para calcular agregados en grandes conjuntos de datos de transmisión, p. enormes archivos de registro
  • LINQ to XML es la mejor API de XML que he usado, y se integra muy bien con LINQ to Objects.
  • Parallel LINQ es una parte muy bonita del marco Extensiones paralelo - que sin duda hace que sea más fácil para paralelizar tareas en las que es apropiado (aunque puede ir hideously wrong si no tiene cuidado) el blog
+0

No había leído la explicación de Push LINQ hasta ahora, probablemente juegue con ella para buscar archivos de registro más tarde :) –

4

Me encanta el sitio blog.functionalfun.net para este propósito: los usos prácticos (y menos prácticos, más divertidos) de LINQ. En definitiva, casi todo lo que cubre se puede aplicar a situaciones de la vida real, pero comenzó a bloguear publicando más temas de "Practical LINQ" para cosas que usa en el código de lógica de negocios que es interesante.

+0

Gracias para enchufar mi blog, Anthony. ¡Creo que te votaré por esto! –

1

Chalie Calvert blog tiene una lista de algunos buenos proveedores de linq.

Nhibernate to Linq

Menciono esto porque expone gran cantidad de retos de aplicación proveedor de LINQ para resolver un problema complejo

15

Robert Shelton de Microsoft era lo suficientemente fría a la lista a few LINQ implementations para nosotros:

A partir del mes 7, 2008:

  • LINQ a Amazon
  • LINQ a Active Directory
  • LINQ a Bindable Fuentes (SyncLINQ)
  • LINQ sobre C-project
  • LINQ to CRM
  • LINQ Para Geo-Language Integrated Query de Datos Geoespaciales
  • LINQ a Excel
  • LINQ a las expresiones (MetaLinq)
  • LINQ Extender (Kit de herramientas para la construcción de los proveedores LINQ)
  • LINQ a Flickr
  • LINQ a Google
  • LINQ a índices (LINQ y i40)
  • LINQ a IQueryable (Matt Warren en Proveedores)
  • LINQ a JSON
  • LINQ to NHibernate
  • LINQ tener JavaScript
  • LINQ a LDAP
  • LINQ a LLBLGen Pro
  • LINQ a Lucene
  • LINQ a Metaweb (base libre)
  • LINQ a MySQL , Oracle y PostgreSql (DbLinq)
  • LINQ a NCover
  • LINQ to Opf3
  • LINQ a paralelo (PLINQ)
  • LINQ a RDF archivos
  • LINQ to SharePoint
  • LINQ a SimpleDB
  • LINQ a corrientes
  • LINQ a WebQueries
  • LINQ a WMI
  • LINQ to XtraGrid
+1

¿qué le parece agregar enlaces a estos? Podría funcionar como un buen diccionario LINQ to x ... – Svish

5

También debe comprobar fuera de Bindable LINQ, desde el sitio CodePlex:.

"Bindable LINQ es un conjunto de extensiones a LINQ que añaden enlace de datos y capacidades de cambio de propagación a consultas LINQ estándar

así como propogating cambio, Bindable LINQ puede analizar sus consultas en tiempo de ejecución y detectar cualquier dependencia tu consulta ha. Si estas dependencias proporcionar eventos para suscribirse, Bindable LINQ automáticamente supervisarlos para el cambio. "

Aquí está uno de los ejemplos del sitio:

Tome esta consulta, por ejemplo:

contactsListBox.ItemsSource = from c in customers 
           where c.Name.StartsWith(textBox1.Text) 
           select c; 

Bindable LINQ detectará que la consulta se basa en la Propiedad de texto de el objeto TextBox, textBox1. Desde el TextBox es un control WPF, B indable LINQ sabe suscribirse al evento TextChanged en el control.

el resultado final es que a medida que el usuario se tipos, los elementos de la consulta son re-evaluados y los cambios aparecen en pantalla. No se necesita ningún código adicional para manejar eventos.

2

Linq to Excel hace que la recuperación de los datos de las hojas de cálculo de Excel sea muy fácil. Se encarga de crear la conexión OLEDB y la instrucción sql. Todo lo que tiene que hacer es indicarle la ruta del archivo a la hoja de cálculo y crear la instrucción linq.

12

Utilicé LINQ para resolver algunos de Project Euler en sentencias únicas de C#. (Tenga en cuenta que las declaraciones no son lo mismo que las líneas)

Cuidado: Evil desagradable trucos.

//Euler 1 
//Add all the natural numbers below one thousand that are multiples of 3 or 5. 
Enumerable.Range(0, 1000).Where(i => i % 5 == 0 || i % 3 == 0).Sum() 

//Euler 2 
//Find the sum of all the even-valued terms in the sequence which do not exceed four million 
//Enumerable.Repeat(new List<long>(1024){ 1, 1 }, 1).First(fib => Enumerable.Range(0, int.MaxValue).TakeWhile(i => fib.Last() <= 4000000) 
    .Aggregate(true, (u1, u2) => { fib.Add(fib.Last() + fib[fib.Count - 2]); return true; })).Where(n => n % 2 == 0).Sum() 

//Euler 3 (>32bit) 
//What is the largest prime factor of the number 600851475143? 
Enumerable.Range(2, Int32.MaxValue - 2).Where(n => 600851475143 % n == 0 && Enumerable.Range(2, n/2 - 1).All(f => n % f > 0)).Max() 

//Euler 4 
//Find the largest palindrome made from the product of two 3-digit numbers. 
Enumerable.Range(100, 900).SelectMany(x => Enumerable.Range(100, 900).Select(y => x * y)) 
          .Where(n => { var s = n.ToString(); return s.SequenceEqual(s.Reverse()); }).Max() 

//Euler 5 (>32bit) 
//What is the smallest number divisible by each of the numbers 1 to 20? 
Enumerable.Range(20, Int32.MaxValue - 21).Where(n => Enumerable.Range(1, 20).All(i => n % i == 0)).First() 

//Euler 6 
//Find the difference between the sum of the squares of the first one hundred natural numbers and the square of the sum. 
Math.Pow(Enumerable.Range(1, 100).Sum(), 2) - Enumerable.Range(1, 100).Select(i => i * i).Sum() 

//Euler 7 
//Find the 10001st prime. 
Enumerable.Range(2, Int32.MaxValue - 1).Where(n => Enumerable.Range(2, n/2 - 1).All(f => n % f > 0)).Skip(10000).First() 

//Euler 8 
//Discover the largest product of five consecutive digits in the 1000-digit number. 
Enumerable.Range(0, 995).Select(i => "7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450" 
    .Substring(i,5).Select(c => c - '0').Aggregate(1, (x, y) => x * y)).Max() 


//Euler 10 
//Find the sum of all the primes below two million. 
Enumerable.Range(2, 2000000).Where(n => Enumerable.Range(2, n/2 - 1).All(f => n % f > 0)).Select(x => (long)x).Sum() 

Enumerable.Range(0, 168).Aggregate(Enumerable.Range(2, 2000000).Select(x => (long)x).ToList(), (result, index) => { result.RemoveAll(i => i > result[index] && i % result[index] == 0); return result; }).Sum() 

Enumerable.Repeat(Enumerable.Range(2, 2000000).Select(x => (long)x).ToList(), 1).SelectMany(list => Enumerable.Range(0, Int32.MaxValue).Select(i => new { List = list, Index = i })) 
    .TakeWhile((g, i) => g.List[g.Index] * g.List[g.Index] <= 2000000 || i.Dump("Rounds") != i).Aggregate((List<long>) null, (result, g) => { g.List.RemoveAll(i => i > g.List[g.Index] && i % g.List[g.Index] == 0); return g.List; }).Sum() 

Enumerable.Repeat(Enumerable.Range(2, 2000000).Select(x => (long)x).ToList(), 1).First(list => Enumerable.Range(0, Int32.MaxValue) 
    .TakeWhile(i => list[i] * list[i] <= 2000000 || i.Dump("Rounds")!=i).Aggregate(0, (count, i) => count + list.RemoveAll(j => j > list[i] && j % list[i] == 0)) != null).Sum() 

//Euler 14 
Enumerable.Range(1, 1000000).Select(s => Enumerable.Repeat(new List<long>(32) { s }, 1).First(list => Enumerable.Range(0, Int32.MaxValue).TakeWhile(i => list.Last() > 1) 
    .Aggregate(0, (index, unused) => { list.Add(list.Last() % 2 == 0 ? list.Last()/2 : 3 * list.Last() + 1); return 1; }) == 1 || true)) 
    .Aggregate(new List<long>(), (list, result) => list.Count <= result.Count ? result : list) 

//Euler 19 
//How many Sundays fell on the first of the month during the twentieth century? 
Enumerable.Range(1901,100).SelectMany(y => Enumerable.Range(1,12).Select(m => new DateTime(y, m, 1))).Where(d => d.DayOfWeek == DayOfWeek.Sunday) 

//Euler 21 
//Evaluate the sum of all the amicable numbers under 10000. 
Enumerable.Repeat(new Func<int, int>(n => Enumerable.Range(1, n/2).Where(d => n % d == 0).Sum()), 1) 
      .Select(D => Enumerable.Range(1, 10000).Where(a => a == D(D(a)) && a != D(a)).Sum()) 

//Euler 34 
//Find the sum of all numbers which are equal to the sum of the factorial of their digits. 
Enumerable.Range(3, 40600).Where(n => n == n.ToString().Select(d => Enumerable.Range(1, d - '0').Aggregate(1, (r, i) => r * i)).Sum()).Sum() 

//Euler 40 
Enumerable.Repeat(new StringBuilder(), 1) 
    .Where(result => Enumerable.Range(0, Int32.MaxValue) 
           .TakeWhile(i => result.Length <= 1000000) 
           .Aggregate(result, (unused, index) => result.Append(index)) != null) 
    .Select(result => Enumerable.Range(1, 6).Select(i => result[(int)Math.Pow(10, i)] - '0')).First().Aggregate(1, (x, y) => x * y) 

Otros LINQ de una sola línea:

//Primes (Ineffecient) 
Enumerable.Range(2, 1000000).Where(n => Enumerable.Range(2, n/2 - 1).All(f => n % f > 0)).Count() 

//Sieve of Eratosthenes 
Enumerable.Range(0, 168) 
      .Aggregate(Enumerable.Range(2, 1000000).ToList(), (result, index) => { 
       result.RemoveAll(i => i > result[index] && i % result[index] == 0); 
       return result; 
      }).Count 
//Prime Factors 
Enumerable.Range(2,13195/2) 
      .Where(n => 13195 % n == 0 
        && Enumerable.Range(2, n/2 - 1).All(f => n % f > 0)) 

//Fibonacci 
Enumerable.Repeat(new List<long>(32){ 1, 1 }, 1) 
    .First(fib => Enumerable.Range(0, 32).Aggregate(true, (u1, u2) => { 
     fib.Add(fib.Last() + fib[fib.Count - 2]); 
     return true; 
    })) 
Cuestiones relacionadas