2009-04-22 28 views

Trả lời

19
  • Hầu như bất cứ điều gì để làm với các bộ sưu tập dễ dàng hơn với LINQ to Objects. Tôi thấy rằng hữu ích hơn nhiều so với LINQ to SQL.
  • Tôi đã trở nên khá thích một khuôn khổ mà Marc Gravell và tôi đã phát triển được gọi là Push LINQ (hiện là một phần của MiscUtil, nhưng có thể di chuyển đến MoreLINQ cuối cùng). Điều này là rất tốt để tính tổng hợp trên các tập dữ liệu phát trực tuyến lớn, ví dụ: các tệp nhật ký khổng lồ
  • LINQ to XML là API XML đẹp nhất mà tôi đã sử dụng và nó tích hợp thực sự độc đáo với LINQ to Objects.
  • Parallel LINQ là một phần rất đẹp của khuôn khổ mở rộng song song - chắc chắn nó làm cho nó dễ dàng hơn để parallelize nhiệm vụ mà nó phù hợp (mặc dù nó có thể đi hideously wrong nếu bạn không cẩn thận) trên blog
+0

Chưa đọc giải thích Push LINQ cho đến bây giờ, có lẽ sẽ chơi với nó để xem các tệp nhật ký sau này :) –

4

Tôi yêu trang web blog.functionalfun.net cho mục đích chính xác này: các ứng dụng thực tế (và ít thực tế hơn, thú vị hơn) của LINQ. Cuối cùng, gần như tất cả mọi thứ mà anh ấy đề cập đều có thể áp dụng cho các tình huống thực tế, nhưng anh ấy bắt đầu viết blog nhiều hơn về các chủ đề "Thực tế LINQ" cho những thứ anh ta sử dụng trong mã logic kinh doanh thú vị.

+0

Cám ơn cắm blog của tôi, Anthony. Tôi nghĩ tôi sẽ bỏ phiếu cho bạn! –

1

Chalie Calvert blog có danh sách một số nhà cung cấp LINQ tốt.

Nhibernate to Linq

Tôi đề cập đến điều này bởi vì nó cho thấy rất nhiều thách thức triển khai cung cấp LINQ để giải quyết một vấn đề phức tạp

15

Robert Shelton của Microsoft đã đủ mát mẻ để liệt kê a few LINQ implementations đối với chúng tôi:

Tính đến tháng 7, 2008:

  • LINQ to Amazon
  • LINQ to Active Directory
  • LINQ to Bindable Nguồn (SyncLINQ)
  • LINQ over C- project
  • LINQ to CRM
  • LINQ Để Geo-Language Integrated Query cho không gian địa lý dữ liệu
  • LINQ to Excel
  • LINQ to Expressions (MetaLinq)
  • LINQ Extender (Toolkit để xây dựng LINQ cung cấp)
  • LINQ to Flickr
  • LINQ Google
  • LINQ to Indexes (LINQ và i40)
  • LINQ to IQueryable (Matt Warren trên Providers)
  • LINQ to JSON
  • LINQ to NHibernate
  • LINQ to JavaScript
  • LINQ to LDAP
  • LINQ to LLBLGen Pro
  • LINQ to Lucene
  • LINQ to Metaweb (Freebase)
  • LINQ to MySQL , Oracle và PostgreSql (DbLinq)
  • LINQ to NCover
  • LINQ to Opf3
  • LINQ to Parallel (PLINQ)
  • LINQ to RDF tập tin
  • LINQ to SharePoint
  • LINQ to SimpleDB
  • LINQ to Streams
  • LINQ to WebQueries
  • LINQ to WMI
  • LINQ to XtraGrid
+1

cách thêm liên kết vào các tệp này? Có thể làm việc như một LINQ to x từ điển ... – Svish

5

Bạn cũng nên kiểm tra Bindable LINQ, từ các trang web CodePlex:.

"Bindable LINQ là một tập hợp các phần mở rộng để LINQ mà thêm dữ liệu ràng buộc và khả năng thay đổi công tác tuyên truyền để truy vấn LINQ chuẩn

Cũng như thay đổi thúc đẩy, LINQ có thể ràng buộc có thể phân tích các truy vấn của bạn khi chạy và phát hiện bất kỳ phụ thuộc nào truy vấn của bạn. Nếu các phụ thuộc này cung cấp các sự kiện để đăng ký, LINQ có thể ràng buộc sẽ tự động giám sát chúng để thay đổi. "

Đây là một trong những ví dụ từ trang web:

Hãy truy vấn này ví dụ:

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

Bindable LINQ sẽ phát hiện rằng các truy vấn dựa trên Thuộc tính văn bản của đối tượng TextBox, textBox1. Kể từ TextBox là điều khiển WPF, B indable LINQ biết đăng ký sự kiện TextChanged trên điều khiển.

Kết quả cuối cùng là khi người dùng loại, các mục trong truy vấn được đánh giá lại và thay đổi xuất hiện trên màn hình . Không cần thêm mã số để xử lý sự kiện.

2

Linq to Excel giúp bạn dễ dàng truy xuất dữ liệu từ bảng tính Excel. Nó đảm nhiệm việc tạo kết nối OLEDB và câu lệnh sql. Tất cả những gì bạn phải làm là nói cho nó đường dẫn tệp tới bảng tính và tạo câu lệnh linq.

12

Tôi đã sử dụng LINQ để giải quyết một số trong số Project Euler trong các câu lệnh C# đơn. (Lưu ý rằng các câu lệnh không giống như dòng)

Hãy coi chừng: Các thủ đoạn xấu xa xấu xa.

//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) 

khác LINQ một lớp lót:

//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; 
    })) 
Các vấn đề liên quan