Enumerable.TakeWhile和Enumerable.SkpWhile

Enumerable.TakeWhile和Enumerable.SkpWhile将通过判断条件,来获取和跳过序列。

TakeWhile方法会在条件为真时,将按照条件继续检索序列,直到条件为false。当条件为false时,则立刻停止检索,并返回此时已经检索过的序列。

SkpWhile方法会在条件为真时,将按照条件继续检索序列,直到条件为false。当条件为false时,则立刻停止检索,并返回此时尚未检索的序列。

        Dim sw As New StringWriter
Dim rnd As New Random Dim cutOff As Integer = rnd.Next(50, 100)
'create a list of containing a fixed set of random numbers:
Dim items As New List(Of Integer)
For i As Integer = 1 To 20
items.Add(rnd.Next(1, 100))
Next sw.WriteLine("the cutoff value was :{0}", cutOff)
sw.WriteLine("the full list is :")
For Each item As Integer In items
sw.Write("{0},", item)
Next Dim list = items.TakeWhile(Function(item) item < cutOff)
'show the list :
sw.WriteLine()
sw.WriteLine("the result list is (item < cutoff):")
For Each item As Integer In list
sw.Write("{0},", item)
Next 'can also pass in the index to the lambda expression:
list = items.TakeWhile(Function(item, index) item > index)
sw.WriteLine()
sw.WriteLine("result list is (takewhile item >index):")
For Each item As Integer In list
sw.Write("{0},", item)
Next list = items.SkipWhile(Function(item, index) item > index)
sw.WriteLine()
sw.WriteLine("the result list is (skipwhile item >index):")
For Each item As Integer In list
sw.Write("{0},", item)
Next

输出的一次结果为:

the cutoff value was :62
the full list is :
33,40,60,57,27,98,93,53,31,37,62,91,82,19,64,30,6,74,98,58,
the result list is (item < cutoff):
33,40,60,57,27,
result list is (takewhile item >index):
33,40,60,57,27,98,93,53,31,37,62,91,82,19,64,30,
the result list is (skipwhile item >index):
6,74,98,58,

计算序列

Enumerable类提供了多种不同的序列计算方法。

Enumerable.Average,Enumerable.Count,Enumerable.Sum,Enumerable.Min,Enumerable.Max

不多说了,看代码吧~

Dim db As New SimpleDataContext
Dim results = db.Products _
.Where(Function(product) product.CategoryId = 1) _
.Select(Function(product) product.UnitPrice) Dim average = results.Average()
Console.WriteLine("average is {0}", average) Dim decimalResults = db.Products _
.Where(Function(product) product.CategoryId = 1)
Dim average1 = decimalResults.Average(Function(product) product.UnitPrice)
Console.WriteLine("average1 is {0}", average1) Dim average2 = db.Products _
.Where(Function(product) product.CategoryId = 1) _
.Average(Function(product) product.UnitPrice)
Console.WriteLine("average2 is {0}", average2) Dim count = results.Count()
Console.WriteLine("count is {0}", count) 'calculate filtered count :
Dim filteredCount = db.Products.Where(Function(product) product.CategoryId = 1) _
.Count(Function(product) product.ProductName.StartsWith("C"))
Console.WriteLine("filteredCount is {0}", filteredCount) 'retrieve the maximum unit price
Dim max = db.Products.Where(Function(product) product.CategoryId = 1) _
.Max(Function(product) product.UnitPrice)
Console.WriteLine("the Max is {0}", max) 'retrieve the minimum unit price for products
'whose name starts with C
Dim min = db.Products.Where(Function(product) product.ProductName.StartsWith("C")) _
.Min(Function(product) product.UnitPrice)
Console.WriteLine("the min is {0}", min)
'calculate sum of units in stock:
Dim total = db.Products.Where(Function(product) product.CategoryId = 1) _
.Sum(Function(product) product.UnitsInStock)
Console.WriteLine("total is {0}", total)

Enumerable.Aggregate

对序列应该累加器。一个很好用的方法~~·

Aggregate方法可简化在值序列上执行计算。此方法的工作原理是对source中的每个元素调用一次func。每次调用func时,Aggregate都将传递序列中的元素和聚合值(聚合值为func的第一个参数)。将seed参数的值作为聚合的初始值。用func的结果替换以前的聚合值。Aggregate返回func的最终结果。

Dim sw As New StringWriter
Dim its() As Integer = {4, 8, 8, 3, 9, 0, 7, 8, 2}
'count the even numbers in the array,using a seed value of 0
Dim numEven As Integer = _
its.Aggregate(0, Function(total, number) _
If(number Mod 2 = 0, total + 1, total))
sw.WriteLine("Even Number Count:{0}", numEven) Dim db As New SimpleDataContext
Dim customers = db.Customers _
.Where(Function(customer) customer.Country = "France") _
.Select(Function(customer) customer.ContactName) 'note that the seed value is an empty string
Dim customerNames = customers.Aggregate(String.Empty, _
Function(current, name) _
If(String.IsNullOrEmpty(current), name, current & "," & name)) 'you can also write like this:
Dim customerNames1 = customers.Aggregate(Function(current, name) current & "," & name) sw.WriteLine("France People ")
sw.WriteLine(customerNames)
sw.WriteLine("Also like this")
sw.WriteLine(customerNames1)
Dim sentence As String _
= "the quick brown fox jumps over the lazy dog"
'split the string into individual words
Dim words() As String = sentence.Split(" "c)
'reverse the word
Dim reversed As String = _
words.Aggregate(Function(current, word) word & " " & current) sw.WriteLine("At First the string :")
sw.WriteLine(sentence)
sw.WriteLine("after reverse:")
sw.WriteLine(reversed)

执行集合操作

Enumerable提供了执行集合操作的方法,例如并集和交集的计算

Enumerable.Concat,Enumerable.Union,Enumerable.Intersect,Enumerable.Except

Enumerable.Concat 连接。是将一个序列全部添加到另一个序列。

Enumerable.Unin 合并。是将一个序列连接到另一序列,并从结果中删除重复项。

Enumerable.Intersect 相交。返回的序列是两个输入序列所共有的全部项目。

Enumerable.Except 与非。返回的序列是属于第一个序列但不属于第二个序列全部项目

Dim db As New SimpleDataContext
Dim sw As New StringWriter
'create two sequences:
Dim groupA = db.Customers _
.Select(Function(customer, index) _
customer.Country).Take(5)
Dim groupB = db.Customers _
.Select(Function(customer, index) customer.Country) _
.Skip(30).Take(5)
'show both groups :
sw.WriteLine("group1: ")
ShowEnumerable(groupA, sw) sw.WriteLine("Group2 :")
ShowEnumerable(groupB, sw) 'return the complete list of countries
Dim groupForConcat = groupA.Concat(groupB)
sw.WriteLine("this is Concat,groupForConcat:")
ShowEnumerable(groupForConcat, sw) 'return a unique list of countries in the two groups :
Dim gourpForUnique = groupA.Union(groupB)
sw.WriteLine("this is Union ,gourpForUnique:")
ShowEnumerable(gourpForUnique, sw) Dim groupIntersect = groupA.Intersect(groupB)
sw.WriteLine("this is Intersect ,groupIntersect:")
ShowEnumerable(groupIntersect, sw) sw.WriteLine("this is Except ,groupExcept:")
Dim groupExcept = groupA.Except(groupB)
ShowEnumerable(groupExcept, sw)

输出的结果:

group1:
Brazil,Mexico,Mexico,UK,Sweden

Group2 :
Brazil,USA,Venezuela,Brazil,Venezuela

this is Concat,groupForConcat:
Brazil,Mexico,Mexico,UK,Sweden,Brazil,USA,Venezuela,Brazil,Venezuela

this is Union ,gourpForUnique:
Brazil,Mexico,UK,Sweden,USA,Venezuela

this is Intersect ,groupIntersect:
Brazil

this is Except ,groupExcept:
Mexico,UK,Sweden

注意,上面的示例使用的都是默认的简单比较器。如果对复杂对象的序列执行集合操作,可以调用那些接受自定义比较器的重载版本方法。

Enumerable.Join

假设一些场景你提供了两个相关序列,你希望根据这两个序列中的键值关联性将其联接在一起。此类任务会被认为是处理关系型数据库中的某些情况。

Dim db As New SimpleDataContext
Dim categrories = db.Categories _
.Where(Function(category) category.CategoryId = 3) Dim results = categrories.Join(db.Products, _
Function(category) category.CategoryId, _
Function(product) product.CategoryId, _
Function(category, product) _
New With {.CategoryName = category.CategoryName, _
.ProductName = product.ProductName}) Dim sw = New StringWriter
For Each item In results
sw.WriteLine("{0}----{1}", item.CategoryName, item.ProductName)
Next

Enumerable.GroupBy

Enumerable.GroupBy方法按照键值将输入序列进行分组,这将创建多组项目。输出序列中的每个组都包含一个”Header”项目以及提供对分组项目访问的Items属性。要调用Enumerable.GroupBy方法,必须至少提供三个函数。第一个提供分组键,第二个提供在组中生成的项目,第三个提供标题内容。

Dim db = New SimpleDataContext
Dim groupedProducts = db.Products _
.Where(Function(product) product.UnitsInStock < 10) _
.GroupBy(Function(product) product.CategoryId, _
Function(product) _
New With {product.ProductName, product.UnitsInStock}, _
Function(catId, group) _
New With {.CategoryID = catId, .Count = group.Count(), .Items = group}) Dim sw = New StringWriter
For Each grouping In groupedProducts
sw.WriteLine("Category {0} :{1} items", grouping.CategoryID, grouping.Count)
For Each item In grouping.Items
sw.WriteLine("{0} {1} ({2})", vbTab, item.ProductName, item.UnitsInStock)
Next
Next

输出结果为:

Category 2 :3 items
     Chef Anton's Gumbo Mix (0)
     Northwoods Cranberry Sauce (6)
     Louisiana Hot Spiced Okra (4)
Category 6 :3 items
     Alice Mutton (0)
     Thüringer Rostbratwurst (0)
     Perth Pasties (0)
Category 3 :2 items
     Sir Rodney's Scones (3)
     Scottish Longbreads (6)
Category 4 :2 items
     Gorgonzola Telino (0)
     Mascarpone Fabioli (9)
Category 8 :1 items
     Røgede sild (5)
Category 7 :1 items
     Longlife Tofu (4)

LINQ Enumerable 续 II的更多相关文章

  1. LINQ Enumerable 续

    筛选序列 Enumerable.Distinct 对于复杂的对象列表,运行时引擎如何才能通过比较确定两个对象是否重复?对于复杂对象,必须提供一个比较器,即实现IEqualityComparer(Of ...

  2. LINQ Enumerable

    System.Linq.Enumerable类,提供了数十种称为扩展方法的共享方法,帮助您操作所有实现IEnumerable(of T)接口的类中的数据.由于Enumerable类的扩展方法可以处理许 ...

  3. 整理一下 System.Linq.Enumerable 类中的那些比较少用的方法

    Linq 虽然用得多,但是里面有一些方法比较少用,因此整理一下.Enumerable 类的所有方法可以在 MSDN 上查阅到:https://msdn.microsoft.com/zh-cn/libr ...

  4. System.ExecutionEngineException: Attempting to JIT compile method System.Linq.Enumerable

    关于JIT编译和AOT编译的问题.IOS下是不支持JIT动态编译的,所以如果程序有涉及JIT编译的都会无法执行. 在google查过说unity是不支持部分的Linq功能,如Sort方法. 但我在un ...

  5. 几种查询方法(lambda Linq Enumerable静态类方式)

    1.需要一个数据源类: using System; using System.Collections.Generic; namespace Linq { public class Student { ...

  6. Linq Enumerable.Distinct方法去重

    Enumerable.Distinct 方法 是常用的LINQ扩展方法,属于System.Linq的Enumerable方法,可用于去除数组.集合中的重复元素,还可以自定义去重的规则. 有两个重载方法 ...

  7. System.Linq.Enumerable 中的方法 Aggregate 函数

      语法: public static TSource Aggregate<TSource>( this IEnumerable<TSource> source, Func&l ...

  8. FCL研究-LINQ-System.Linq Enumerable

    .net 里面集合操作极为方便,尤其是实现了IEnumerable接口的集合,一直在使用,系统的研究一下集合的操作也是极好的. 类型 操作符名称 投影操作符 Select,SelectMany 限制操 ...

  9. 十五、C# 使用查询表达式的LINQ

    使用查询表达式的LINQ   本章介绍了一种新的语法,查询表达式.   1.查询表达式概述 2.特点:投射  筛选  排序   Let  分组 3.作为方法调用   标准查询运算符所实现的查询在功能上 ...

随机推荐

  1. js中的模块化编写思维

    作为一个新手程序员,在编程时一定要刻意锻炼自己的模块化编写思路,但是究竟什么才是模块化编写对于新人来说还是不太能够直观的理解,下面就举个简单的例子来说明一下 概念:最早接触模块化的说法是从java上, ...

  2. window.onload() 等待所有的数据加载都完成之后才会触发

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. Delphi笔记(GL_Scene四轴飞行器模型)

    有了前的一篇做铺垫,已经简单的说了GL_Scene的下载安装和一个简单的实例制作.现在就要开始制作一个3D的模型了,具体的步骤就不再这里多说了,直接上图和代码吧! [第一版]先看一下最开始的版本吧,比 ...

  4. Lucene查询条数限制

    运用Lucene进行索引,在查询的时候是有条数限制的 public virtual TopFieldDocs Search(Query query, Filter filter, int n, Sor ...

  5. Linux_hadoop_install

    1. Build Linux env my env is VM RedHat Linux 6.5 64bit    set fixed IP                  vim /etc/sys ...

  6. javasript生成 uuid的几种算法分享

    方式一 function uuid() { var s = []; var hexDigits = "0123456789abcdef"; for (var i = 0; i &l ...

  7. Android中AsyncTask异步

    今天我们学习了 AsyncTack, 这是一个异步任务. 那么这个异步任务可以干什么呢? 因为只有UI线程,即主线程可以对控件进行更新操作.好处是保证UI稳定性,避免多线程对UI同时操作. 同时要把耗 ...

  8. PHP之路——PHPStudy虚拟主机

    一: Apache/conf/httpd.conf打开以下扩展 LoadModule rewrite_module modules/mod_rewrite.so LoadModule vhost_al ...

  9. Windows提供了两种将DLL映像到进程地址空间的方法(隐式和显式)

    调用DLL,首先需要将DLL文件映像到用户进程的地址空间中,然后才能进行函数调用,这个函数和进程内部一般函数的调用方法相同.Windows提供了两种将DLL映像到进程地址空间的方法: 1. 隐式的加载 ...

  10. BZOJ1708: [Usaco2007 Oct]Money奶牛的硬币

    1708: [Usaco2007 Oct]Money奶牛的硬币 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 513  Solved: 329[Submi ...