LINQ to SQL之外的LINQ有哪些聪明的用法?
您是否发现LINQ更容易解决的任何问题?请发布示例.
LINQ to Objects几乎与集合有关.我发现它比LINQ to SQL更有用.
我变得非常喜欢Marc Gravell和我开发的一个名为Push LINQ的框架(目前是MiscUtil的一部分,但最终可能转移到MoreLINQ).这非常适合计算大型流数据集上的聚合,例如巨大的日志文件
LINQ to XML是我使用的最好的XML API,它与LINQ to Objects非常完美地集成.
并行LINQ是Parallel Extensions框架的一个非常好的部分 - 它确实可以更容易地在适当的位置并行化任务(尽管如果你不小心它可能会出错)
微软的Robert Shelton非常酷,可以为我们列出一些LINQ实现:
截至2008年7月7日:
LINQ到亚马逊
LINQ到Active Directory
LINQ to Bindable Sources(SyncLINQ)
LINQ over C-项目
LINQ to CRM
LINQ到地理空间数据的地理语言集成查询
LINQ to Excel
LINQ to Expressions(MetaLinq)
LINQ Extender(用于构建LINQ提供程序的工具包)
LINQ to Flickr
LINQ to Google
LINQ to Indexes(LINQ和i40)
LINQ to IQueryable(Matt Warren on Providers)
LINQ to JSON
LINQ to NHibernate
LINQ to JavaScript
LINQ to LDAP
LINQ to LLBLGen Pro
LINQ到Lucene
LINQ to Metaweb(freebase)
LINQ to MySQL,Oracle和PostgreSql(DbLinq)
LINQ到NCover
LINQ to Opf3
LINQ并行(PLINQ)
LINQ to RDF文件
LINQ to Sharepoint
LINQ to SimpleDB
LINQ to Streams
LINQ to WebQueries
LINQ to WMI
LINQ to XtraGrid
我使用LINQ 在单个C#语句中解决了一些Project Euler.(注意语句与行不同)
当心:邪恶的恶作剧.
//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(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 ) 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 (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 (), (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 (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)
其他LINQ单线程:
//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(32){ 1, 1 }, 1) .First(fib => Enumerable.Range(0, 32).Aggregate(true, (u1, u2) => { fib.Add(fib.Last() + fib[fib.Count - 2]); return true; }))
您还应该从CodePlex站点查看Bindable LINQ:
"Bindable LINQ是LINQ的一组扩展,可以为标准LINQ查询添加数据绑定和更改传播功能.
除了传播更改之外,Bindable LINQ还可以在运行时分析您的查询并检测查询所具有的任何依赖项.如果这些依赖项提供要订阅的事件,Bindable LINQ将自动监视它们的更改."
以下是该网站的一个示例:
以此查询为例:
contactsListBox.ItemsSource = from c in customers where c.Name.StartsWith(textBox1.Text) select c;
Bindable LINQ将检测到查询依赖于TextBox对象textBox1的Text属性.由于TextBox是WPF控件,因此Bindable LINQ知道在控件上订阅TextChanged事件.
最终结果是,当用户键入时,将重新评估查询中的项目,并在屏幕上显示更改.处理事件不需要其他代码.