From 8d9f69923595442bda12098f928911327255c7e5 Mon Sep 17 00:00:00 2001 From: bicijinlian Date: Sat, 7 Sep 2019 15:46:01 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=86=E5=8C=BA=E6=93=8D=E4=BD=9C=E7=AC=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LinqStudy.Test/LinqToObject/ShardingTest.cs | 296 ++++++++++++++++++ LinqStudy.Test/LinqToObject/TakeTest.cs | 103 ------ .../LinqToObject/标准查询操作符.md | 5 +- 3 files changed, 300 insertions(+), 104 deletions(-) create mode 100644 LinqStudy.Test/LinqToObject/ShardingTest.cs delete mode 100644 LinqStudy.Test/LinqToObject/TakeTest.cs 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