当前位置:  开发笔记 > 编程语言 > 正文

LINQ的一些巧妙用途是什么?

如何解决《LINQ的一些巧妙用途是什么?》经验,为你挑选了4个好方法。

LINQ to SQL之外的LINQ有哪些聪明的用法?

您是否发现LINQ更容易解决的任何问题?请发布示例.



1> Jon Skeet..:

LINQ to Objects几乎与集合有关.我发现它比LINQ to SQL更有用.

我变得非常喜欢Marc Gravell和我开发的一个名为Push LINQ的框架(目前是MiscUtil的一部分,但最终可能转移到MoreLINQ).这非常适合计算大型流数据集上的聚合,例如巨大的日志文件

LINQ to XML是我使用的最好的XML API,它与LINQ to Objects非常完美地集成.

并行LINQ是Parallel Extensions框架的一个非常好的部分 - 它确实可以更容易地在适当的位置并行化任务(尽管如果你不小心它可能会出错)



2> rasx..:

微软的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



3> SLaks..:

我使用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; 
    }))



4> RobS..:

您还应该从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事件.

最终结果是,当用户键入时,将重新评估查询中的项目,并在屏幕上显示更改.处理事件不需要其他代码.

推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有