diff --git a/LinqStudy.Test/LinqToObject/ShardingTest.cs b/LinqStudy.Test/LinqToObject/ShardingTest.cs
new file mode 100644
index 0000000..f547df3
--- /dev/null
+++ b/LinqStudy.Test/LinqToObject/ShardingTest.cs
@@ -0,0 +1,296 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Linq;
+using System.Linq.Expressions;
+
+using Xunit;
+
+namespace LinqStudy.Test.LinqToObject
+{
+ ///
+ /// 分区操作符
+ ///
+ public class ShardingTest
+ {
+ #region Take
+
+ ///
+ /// Take:返回序列中,从0开始的连续指定项数据子序列;延迟执行。
+ ///
+ [Fact]
+ public void Take_Test()
+ {
+ List customers = new List {
+ new Person { Id=1,Name="woody1"},
+ new Person { Id=2,Name="woody2"},
+ new Person { Id=3,Name="woody3"},
+ new Person { Id=4,Name="woody4"}
+ };
+
+ var queryItem = customers.Take(2);
+ var queryItemCount = queryItem.Count();
+
+ Assert.Equal(2,queryItemCount);
+ }
+
+ ///
+ /// 延迟执行
+ ///
+ [Fact]
+ public void Take_Daley_Test()
+ {
+ List customers = new List {
+ new Person { Id=1,Name="woody1"},
+ new Person { Id=2,Name="woody2"},
+ new Person { Id=3,Name="woody3"},
+ new Person { Id=4,Name="woody4"}
+ };
+
+ //使用操作符(相当于定义)
+ var queryItem = customers.Take(1);
+
+ //使用后,添加新项到集合头部
+ var addItem = new Person { Id = 0, Name = "woody0" };
+ customers.Insert(0, addItem);
+
+ //使用操作符操作结果(相当于:此时执行操作)
+ var firstItemId = queryItem.First().Id;
+
+ //操作结果,包含数据源的变化
+ Assert.Equal(0, firstItemId);
+ }
+
+ ///
+ /// 超过数据源项数:返回全部项,不抛出异常。
+ ///
+ [Fact]
+ public void Take_OverCount_Test()
+ {
+ List customers = new List {
+ new Person { Id=1,Name="woody1"},
+ new Person { Id=2,Name="woody2"},
+ new Person { Id=3,Name="woody3"},
+ new Person { Id=4,Name="woody4"}
+ };
+
+ var person = customers.Take(100);
+
+ var sourceCount = customers.Count;
+ var queryItecCount = person.Count();
+
+ //超过数据源项数,返回全部项。
+ Assert.Equal(sourceCount, queryItecCount);
+ }
+
+ ///
+ /// ArgumentNullException 异常
+ ///
+ [Fact]
+ public void Take_ArgumentNullException_Test()
+ {
+ List customers = null;
+
+ Action takeQuery = () => customers.Take(100);
+
+ Assert.Throws(takeQuery);
+ }
+ #endregion
+
+ #region TakeWhile
+
+ ///
+ /// TakeWhile:从序列开头开始选序列项,遇到第一个不满足选择条件的项时,返回;延迟执行。
+ ///
+ [Fact]
+ public void TakeWhile_Test()
+ {
+ List customers = new List {
+ new Person { Id=1,Name="woody1"},
+ new Person { Id=2,Name="woody2"},
+ new Person { Id=3,Name="woody3"},
+ new Person { Id=4,Name="woody1"}
+ };
+
+ var person = customers.TakeWhile(c => c.Name.StartsWith("woody1"));
+
+ //因为匹配第二项时,结果是False,程序返回,不再进行下次迭代,所以返回集合中只有第一项。
+ Assert.Equal(customers.FindAll(q => q.Id == 1), person);
+ }
+
+ [Fact]
+ public void TakeWhile_Test2()
+ {
+ List customers = new List {
+ new Person { Id=1,Name="woody1"},
+ new Person { Id=2,Name="woody2"},
+ new Person { Id=3,Name="woody3"},
+ new Person { Id=4,Name="woody1"}
+ };
+
+ var person = customers.TakeWhile(c => c.Name.StartsWith("woody2"));
+
+ //因为匹配第一项时,结果是False,程序直接返回,不再进行下次迭代,所以返回空集合。
+ Assert.Empty(person);
+ }
+
+ ///
+ /// 延迟执行
+ ///
+ [Fact]
+ public void TakeWhile_Delay_Test()
+ {
+ List customers = new List {
+ new Person { Id=1,Name="woody1"},
+ new Person { Id=2,Name="woody2"},
+ new Person { Id=3,Name="woody3"},
+ new Person { Id=4,Name="woody1"}
+ };
+
+ //TakeWhile
+ var person = customers.TakeWhile(c => c.Name.StartsWith("woody"));
+
+ //TakeWhile后,改变数据源
+ var addItem = new Person { Id = 6, Name = "sunday" };
+ customers.Insert(2,addItem);
+
+ //选择结果
+ var queryCount = person.Count();
+
+ //结果受数据源变化的影响
+ Assert.Equal(2, queryCount);
+ }
+ #endregion
+
+ #region Skip
+ ///
+ /// Skip:跳过指定数据的元素,返回其余元素。
+ ///
+ [Fact]
+ public void Skip_Test()
+ {
+ List customers = new List {
+ new Person { Id=1,Name="woody1"},
+ new Person { Id=2,Name="woody2"},
+ new Person { Id=3,Name="woody3"},
+ new Person { Id=4,Name="woody4"}
+ };
+
+ var queryItem = customers.Skip(1);
+ var queryItemCount = queryItem.Count();
+
+ Assert.Equal(3, queryItemCount);
+ }
+
+ ///
+ /// 延迟执行
+ ///
+ [Fact]
+ public void Skip_Daley_Test()
+ {
+ List customers = new List {
+ new Person { Id=1,Name="woody1"},
+ new Person { Id=2,Name="woody2"},
+ new Person { Id=3,Name="woody3"},
+ new Person { Id=4,Name="woody4"}
+ };
+
+ //使用操作符(相当于定义)
+ var queryItem = customers.Skip(4);
+
+ //使用后,添加新项到集合头部
+ var addItem = new Person { Id = 5, Name = "woody0" };
+ customers.Add(addItem);
+
+ //使用操作符操作结果(相当于:此时执行操作)
+ var firstItemId = queryItem.First().Id;
+
+ //操作结果,包含数据源的变化
+ Assert.Equal(5, firstItemId);
+ }
+
+ ///
+ /// 超过数据源项数:返回0个项的序列,不抛出异常。
+ ///
+ [Fact]
+ public void Skip_OverCount_Test()
+ {
+ List customers = new List {
+ new Person { Id=1,Name="woody1"},
+ new Person { Id=2,Name="woody2"},
+ new Person { Id=3,Name="woody3"},
+ new Person { Id=4,Name="woody4"}
+ };
+
+ var person = customers.Skip(100);
+ var queryItecCount = person.Count();
+
+ //超过数据源项数,返回0个元素的序列。
+ Assert.Equal(0, queryItecCount);
+ }
+
+ ///
+ /// ArgumentNullException 异常
+ ///
+ [Fact]
+ public void S_ArgumentNullException_Test()
+ {
+ List customers = null;
+
+ Action takeQuery = () => customers.Skip(100);
+
+ Assert.Throws(takeQuery);
+ }
+ #endregion
+
+ #region SkipWhile
+
+ ///
+ /// SkipWhile:基于特定条件,跳过元素,直到第一次条件为False时停跳过,选择其余项(包括条件为false的这一项),返回。
+ ///
+ [Fact]
+ public void SkipWhile_Test()
+ {
+ List customers = new List {
+ new Person { Id=1,Name="woody1"},
+ new Person { Id=2,Name="woody2"},
+ new Person { Id=3,Name="sunday3"},
+ new Person { Id=4,Name="woody1"}
+ };
+
+ //因为匹配第3项时,结果是False,停止跳过,并选择后面所有(包括第3)所有项。
+ var person = customers.SkipWhile(c => c.Name.StartsWith("wood"));
+ var queryItemCount = person.Count();
+
+ Assert.Equal(2, queryItemCount);
+ }
+
+ ///
+ /// 延迟执行
+ ///
+ [Fact]
+ public void SkipWhile_Delay_Test()
+ {
+ List customers = new List {
+ new Person { Id=1,Name="woody1"},
+ new Person { Id=2,Name="woody2"},
+ new Person { Id=3,Name="woody3"},
+ new Person { Id=4,Name="woody1"}
+ };
+
+ //TakeWhile
+ var person = customers.SkipWhile(c => c.Name.StartsWith("woody"));
+
+ //TakeWhile后,改变数据源
+ var addItem = new Person { Id = 6, Name = "sunday" };
+ customers.Insert(1, addItem);
+
+ //选择结果
+ var queryCount = person.Count();
+
+ //结果受数据源变化的影响
+ Assert.Equal(4, queryCount);
+ }
+ #endregion
+ }
+}
diff --git a/LinqStudy.Test/LinqToObject/TakeTest.cs b/LinqStudy.Test/LinqToObject/TakeTest.cs
deleted file mode 100644
index 084bbe0..0000000
--- a/LinqStudy.Test/LinqToObject/TakeTest.cs
+++ /dev/null
@@ -1,103 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-using System.Linq;
-using System.Linq.Expressions;
-
-using Xunit;
-
-namespace LinqStudy.Test.LinqToObject
-{
- public class TakeTest
- {
- [Fact]
- public void TakeWhile_Test()
- {
- List customers = new List {
- new Person { Id=1,Name="woody1"},
- new Person { Id=2,Name="woody2"},
- new Person { Id=3,Name="woody3"},
- new Person { Id=4,Name="woody1"}
- };
-
- var person = customers.TakeWhile(c => c.Name.StartsWith("woody1"));
-
- //因为匹配第二项时,结果是False,程序返回,不再进行下次迭代,所以返回集合中只有第一项。
- Assert.Equal(customers.FindAll(q => q.Id == 1), person); }
-
- [Fact]
- public void Test()
- {
- List customers = new List {
- new Person { Id=1,Name="woody1"},
- new Person { Id=2,Name="woody2"},
- new Person { Id=3,Name="woody3"},
- new Person { Id=4,Name="woody1"}
- };
-
- var person = customers.TakeWhile(c => c.Name.StartsWith("woody2"));
-
- //因为匹配第一项时,结果是False,程序直接返回,不再进行下次迭代,所以返回空集合。
- Assert.Empty(person);
- }
-
- [Fact]
- public void Test_0()
- {
- List perons1 = new List {
- new Person { Id=1,Name="woody1"},
- new Person { Id=2,Name="woody2"},
- new Person { Id=3,Name="woody3"},
- new Person { Id=4,Name="woody4"},
- };
-
- List perons2 = new List {
- new Person { Id=3,Name="woody3"},
- new Person { Id=4,Name="woody1"},
- new Person { Id=5,Name="woody5"},
- new Person { Id=6,Name="woody6"},
- };
-
- var person = perons1.Intersect(perons2).ToList();
-
- //特别注意:引用对象比较是否同一个引用,虽然内容一样,但引用不一样,交集仍然为空集合。
- Assert.Empty(person);
- }
-
- [Fact]
- public void Test_1()
- {
- List test1 = new List() { 1, 2, 3, 4 };
- List test2 = new List() { 3, 4, 5, 6 };
-
- var person = test1.Intersect(test2).ToList();
-
- //特别注意:值对象,比较值本身。
- Assert.Equal(2, person.Count);
- }
-
- [Fact]
- public void Test_3()
- {
- List perons1 = new List {
- new Person { Id=1,Name="woody1"},
- new Person { Id=2,Name="woody2"},
- new Person { Id=3,Name="woody3"},
- new Person { Id=4,Name="woody4"},
- };
-
- List perons2 = new List {
- new Person { Id=3,Name="woody3"},
- new Person { Id=4,Name="woody4"},
- new Person { Id=5,Name="woody5"},
- new Person { Id=6,Name="woody6"},
- };
-
- perons1.AddRange(perons2);
-
- var cc= perons1.Distinct().ToList();
- Assert.Equal(8,cc.Count);
- }
- }
-
-}
diff --git a/LinqStudy.Test/LinqToObject/标准查询操作符.md b/LinqStudy.Test/LinqToObject/标准查询操作符.md
index d8b9020..7101401 100644
--- a/LinqStudy.Test/LinqToObject/标准查询操作符.md
+++ b/LinqStudy.Test/LinqToObject/标准查询操作符.md
@@ -32,4 +32,7 @@
## 量词操作符
-## 分割操作符
\ No newline at end of file
+## 分割操作符
+ Take 返回序列中,从0开始的连续指定项数据子序列;延迟执行。
+
+ TakeWhile
\ No newline at end of file