diff --git a/TupleStudy/ValueTupleStudy.cs b/TupleStudy/ValueTupleStudy.cs index 8c5e5b1..189a4f2 100644 --- a/TupleStudy/ValueTupleStudy.cs +++ b/TupleStudy/ValueTupleStudy.cs @@ -14,6 +14,183 @@ namespace TupleStudy /// public class ValueTupleStudy { - + #region 构造函数 创建值元组 + + /// + /// 创建0元素的值元组 + /// + public ValueTuple CreateValueTuple() + { + var tuple = new ValueTuple(); + + return tuple; + } + + /// + /// 创建1元素的值元组 + /// + public ValueTuple CreateValueTuple(T1 value) + { + var tuple = new ValueTuple(value); + + return tuple; + } + + /// + /// 创建2元素的值元组 + /// + public ValueTuple CreateValueTuple(T1 value1, T2 value2) + { + var tuple = new ValueTuple(value1, value2); + + return tuple; + } + + /// + /// 创建3元素的值元组 + /// + public ValueTuple CreateValueTuple(T1 value1, T2 value2, T3 value3) + { + var tuple = new ValueTuple(value1, value2, value3); + + return tuple; + } + + /// + /// 创建4元素的值元组 + /// + public ValueTuple CreateValueTuple(T1 value1, T2 value2, T3 value3, T4 value4) + { + var tuple = new ValueTuple(value1, value2, value3, value4); + + return tuple; + } + + /// + /// 创建5元素的值元组 + /// + public ValueTuple CreateValueTuple(T1 value1, T2 value2, T3 value3, T4 value4, T5 value5) + { + var tuple = new ValueTuple(value1, value2, value3, value4, value5); + + return tuple; + } + + /// + /// 创建6元素的值元组 + /// + public ValueTuple CreateValueTuple(T1 value1, T2 value2, T3 value3, T4 value4, T5 value5, T6 value6) + { + var tuple = new ValueTuple(value1, value2, value3, value4, value5, value6); + + return tuple; + } + + /// + /// 创建7元素的值元组 + /// + public ValueTuple CreateValueTuple(T1 value1, T2 value2, T3 value3, T4 value4, T5 value5, T6 value6, T7 value7) + { + var tuple = new ValueTuple(value1, value2, value3, value4, value5, value6, value7); + + return tuple; + } + + /// + /// 创建8元素的值元组 + /// + public ValueTuple CreateValueTuple(T1 value1, T2 value2, T3 value3, T4 value4, T5 value5, T6 value6, T7 value7, TRest restValue) where TRest : struct + { + var tuple = new ValueTuple(value1, value2, value3, value4, value5, value6, value7, restValue); + + return tuple; + } + #endregion + + #region 静态Create方法 创建值元组 + + /// + /// 创建0元素的值元组 + /// + public ValueTuple GetValueTuple() + { + var tuple = ValueTuple.Create(); + return tuple; + } + + /// + /// 创建1元素的值元组 + /// + public ValueTuple GetValueTuple(T1 item1) + { + var tuple = ValueTuple.Create(item1); + return tuple; + } + + /// + /// 创建2元素的值元组 + /// + public ValueTuple GetValueTuple(T1 item1, T2 item2) + { + var tuple = ValueTuple.Create(item1, item2); + return tuple; + } + + /// + /// 创建3元素的值元组 + /// + public ValueTuple GetValueTuple(T1 item1, T2 item2, T3 item3) + { + var tuple = ValueTuple.Create(item1, item2, item3); + return tuple; + } + + /// + /// 创建4元素的值元组 + /// + public ValueTuple GetValueTuple(T1 item1, T2 item2, T3 item3, T4 item4) + { + var tuple = ValueTuple.Create(item1, item2, item3, item4); + return tuple; + } + + /// + /// 创建5元素的值元组 + /// + public ValueTuple GetValueTuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5) + { + var tuple = ValueTuple.Create(item1, item2, item3, item4, item5); + return tuple; + } + + /// + /// 创建6元素的值元组 + /// + public ValueTuple GetValueTuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6) + { + var tuple = ValueTuple.Create(item1, item2, item3, item4, item5, item6); + return tuple; + } + + /// + /// 创建7元素的值元组 + /// + public ValueTuple GetValueTuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7) + { + var tuple = ValueTuple.Create(item1, item2, item3, item4, item5, item6, item7); + return tuple; + } + + /// + /// 创建8元素的值元组 + /// + public (T1, T2, T3, T4, T5, T6, T7, TRest) GetValueTuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7, TRest item8) where TRest:struct + { + var tuple = ValueTuple.Create(item1, item2, item3, item4, item5, item6, item7, item8); + return tuple; + } + #endregion + + } } diff --git a/TupleStudyTest/TupleStudyTest.csproj b/TupleStudyTest/TupleStudyTest.csproj index cb40066..efbd295 100644 --- a/TupleStudyTest/TupleStudyTest.csproj +++ b/TupleStudyTest/TupleStudyTest.csproj @@ -11,10 +11,11 @@ Properties TupleStudyTest TupleStudyTest - v4.6.1 + v4.7 512 + true diff --git a/TupleStudyTest/ValueTupleStudyTest.cs b/TupleStudyTest/ValueTupleStudyTest.cs index 1605ec7..f419b80 100644 --- a/TupleStudyTest/ValueTupleStudyTest.cs +++ b/TupleStudyTest/ValueTupleStudyTest.cs @@ -15,49 +15,49 @@ namespace TupleStudyTest { public class ValueTupleStudyTest { - private TupleStudy.ValueTupleStudy tupleStudy; + private ValueTupleStudy valueTupleStudy; public ValueTupleStudyTest() { - tupleStudy = new TupleStudy.ValueTupleStudy(); + valueTupleStudy = new ValueTupleStudy(); } /// /// 使用构造函数创建值元组 /// [Fact] - public void Create_ValueTuple_Constructor_Test() + public void CreateValueTuple_Test() { //创建包含零个元组的值元组 - var zeroTuple = new ValueTuple(); + System.ValueTuple zeroTuple = this.valueTupleStudy.CreateValueTuple(); Assert.IsType(zeroTuple); //1个元组的值元组 - var oneTuple = new ValueTuple(1); + var oneTuple = valueTupleStudy.CreateValueTuple(1); Assert.Equal(1, oneTuple.Item1); Assert.Equal("first", new ValueTuple("first").Item1); //2个元组的值元组 - var twoTuple = new ValueTuple(1,2); + var twoTuple = valueTupleStudy.CreateValueTuple(1, 2); Assert.Equal(1, twoTuple.Item1); Assert.Equal(2, twoTuple.Item2); //3个元组的值元组 - var threeTuple = new ValueTuple(1,2,3); + var threeTuple = valueTupleStudy.CreateValueTuple(1, 2, 3); Assert.Equal(1, threeTuple.Item1); Assert.Equal(2, threeTuple.Item2); Assert.Equal(3, threeTuple.Item3); //4个元组的值元组 - var fourTuple = new ValueTuple(1,2,3,4); + var fourTuple = valueTupleStudy.CreateValueTuple(1, 2, 3, 4); Assert.Equal(1, fourTuple.Item1); Assert.Equal(2, fourTuple.Item2); Assert.Equal(3, fourTuple.Item3); Assert.Equal(4, fourTuple.Item4); //5个元组的值元组 - var fiveTuple = new ValueTuple(1,2,3,4,5); + var fiveTuple = valueTupleStudy.CreateValueTuple(1, 2, 3, 4, 5); Assert.Equal(1, fiveTuple.Item1); Assert.Equal(2, fiveTuple.Item2); Assert.Equal(3, fiveTuple.Item3); @@ -65,7 +65,7 @@ namespace TupleStudyTest Assert.Equal(5, fiveTuple.Item5); //6个元组的值元组 - var sixTuple = new ValueTuple(1, 2, 3, 4, 5, 6); + var sixTuple = valueTupleStudy.CreateValueTuple(1, 2, 3, 4, 5, 6); Assert.Equal(1, sixTuple.Item1); Assert.Equal(2, sixTuple.Item2); Assert.Equal(3, sixTuple.Item3); @@ -74,7 +74,7 @@ namespace TupleStudyTest Assert.Equal(6, sixTuple.Item6); //7个元组的值元组 - var sevenTuple = new ValueTuple(1, 2, 3, 4, 5, 6, 7); + var sevenTuple = valueTupleStudy.CreateValueTuple(1, 2, 3, 4, 5, 6, 7); Assert.Equal(1, sevenTuple.Item1); Assert.Equal(2, sevenTuple.Item2); Assert.Equal(3, sevenTuple.Item3); @@ -84,7 +84,7 @@ namespace TupleStudyTest Assert.Equal(7, sevenTuple.Item7); //8个及以上元组的值元组:元组嵌套 - var overSevenTuple = new ValueTuple>(1, 2, 3, 4, 5, 6, 7, new ValueTuple(8, 9, 10)); + var overSevenTuple = valueTupleStudy.CreateValueTuple>(1, 2, 3, 4, 5, 6, 7, new ValueTuple(8, 9, 10)); Assert.Equal(1, overSevenTuple.Item1); Assert.Equal(2, overSevenTuple.Item2); Assert.Equal(3, overSevenTuple.Item3); @@ -100,5 +100,11 @@ namespace TupleStudyTest //16个以上,要审视程序设计,是否确实需要使用ValueTuple,最好改成设计成类 } + + [Fact] + public void GetValueTuple_Test() + { + + } } } diff --git a/ValueTupleStudyTest/Properties/AssemblyInfo.cs b/ValueTupleStudyTest/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..df13f1b --- /dev/null +++ b/ValueTupleStudyTest/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("ValueTupleStudyTest")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ValueTupleStudyTest")] +[assembly: AssemblyCopyright("Copyright © 2018")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("90707ba8-33b0-4ee7-abf5-36303f2aaa18")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +// 可以指定所有值,也可以使用以下所示的 "*" 预置版本号和修订号 +//通过使用 "*",如下所示: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/ValueTupleStudyTest/ValueTupleStudyTest.cs b/ValueTupleStudyTest/ValueTupleStudyTest.cs new file mode 100644 index 0000000..0633cb8 --- /dev/null +++ b/ValueTupleStudyTest/ValueTupleStudyTest.cs @@ -0,0 +1,108 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +using Xunit; + +using TupleStudy; + +namespace ValueTupleStudyTest +{ + /// + /// ValueTuple 需要.net framework 4.7及以上 + /// .net framework 4.7及以下,需要Nuget引用包System.ValueTuple 库 + /// + public class ValueTupleStudyTest + { + private ValueTupleStudy valueTupleStudy; + + /// + /// 构造函数 + /// + public ValueTupleStudyTest() + { + valueTupleStudy = new ValueTupleStudy(); + } + + /// + /// 使用构造函数创建值元组 + /// + [Fact] + public void CreateValueTuple_Test() + { + //创建包含零个元组的值元组 + var zeroTuple = this.valueTupleStudy.CreateValueTuple(); + Assert.IsType(zeroTuple); + + //1个元组的值元组 + var oneTuple = valueTupleStudy.CreateValueTuple(1); + Assert.Equal(1, oneTuple.Item1); + Assert.Equal("first", new ValueTuple("first").Item1); + + //2个元组的值元组 + var twoTuple = valueTupleStudy.CreateValueTuple(1, 2); + Assert.Equal(1, twoTuple.Item1); + Assert.Equal(2, twoTuple.Item2); + + //3个元组的值元组 + var threeTuple = valueTupleStudy.CreateValueTuple(1, 2, 3); + Assert.Equal(1, threeTuple.Item1); + Assert.Equal(2, threeTuple.Item2); + Assert.Equal(3, threeTuple.Item3); + + + //4个元组的值元组 + var fourTuple = valueTupleStudy.CreateValueTuple(1, 2, 3, 4); + Assert.Equal(1, fourTuple.Item1); + Assert.Equal(2, fourTuple.Item2); + Assert.Equal(3, fourTuple.Item3); + Assert.Equal(4, fourTuple.Item4); + + //5个元组的值元组 + var fiveTuple = valueTupleStudy.CreateValueTuple(1, 2, 3, 4, 5); + Assert.Equal(1, fiveTuple.Item1); + Assert.Equal(2, fiveTuple.Item2); + Assert.Equal(3, fiveTuple.Item3); + Assert.Equal(4, fiveTuple.Item4); + Assert.Equal(5, fiveTuple.Item5); + + //6个元组的值元组 + var sixTuple = valueTupleStudy.CreateValueTuple(1, 2, 3, 4, 5, 6); + Assert.Equal(1, sixTuple.Item1); + Assert.Equal(2, sixTuple.Item2); + Assert.Equal(3, sixTuple.Item3); + Assert.Equal(4, sixTuple.Item4); + Assert.Equal(5, sixTuple.Item5); + Assert.Equal(6, sixTuple.Item6); + + //7个元组的值元组 + var sevenTuple = valueTupleStudy.CreateValueTuple(1, 2, 3, 4, 5, 6, 7); + Assert.Equal(1, sevenTuple.Item1); + Assert.Equal(2, sevenTuple.Item2); + Assert.Equal(3, sevenTuple.Item3); + Assert.Equal(4, sevenTuple.Item4); + Assert.Equal(5, sevenTuple.Item5); + Assert.Equal(6, sevenTuple.Item6); + Assert.Equal(7, sevenTuple.Item7); + + //8个及以上元组的值元组:元组嵌套 + var overSevenTuple = valueTupleStudy.CreateValueTuple>(1, 2, 3, 4, 5, 6, 7, new ValueTuple(8, 9, 10)); + Assert.Equal(1, overSevenTuple.Item1); + Assert.Equal(2, overSevenTuple.Item2); + Assert.Equal(3, overSevenTuple.Item3); + Assert.Equal(4, overSevenTuple.Item4); + Assert.Equal(5, overSevenTuple.Item5); + Assert.Equal(6, overSevenTuple.Item6); + Assert.Equal(7, overSevenTuple.Item7); + + //元组嵌套 + Assert.Equal(8, overSevenTuple.Item8); + Assert.Equal(9, overSevenTuple.Item9); + Assert.Equal(10, overSevenTuple.Item10); + + //16个以上,要审视程序设计,是否确实需要使用ValueTuple,最好改成设计成类 + } + } +} diff --git a/ValueTupleStudyTest/ValueTupleStudyTest.csproj b/ValueTupleStudyTest/ValueTupleStudyTest.csproj new file mode 100644 index 0000000..dee134a --- /dev/null +++ b/ValueTupleStudyTest/ValueTupleStudyTest.csproj @@ -0,0 +1,87 @@ + + + + + + + Debug + AnyCPU + {90707BA8-33B0-4EE7-ABF5-36303F2AAA18} + Library + Properties + ValueTupleStudyTest + ValueTupleStudyTest + v4.7 + 512 + + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + ..\packages\xunit.abstractions.2.0.2\lib\net35\xunit.abstractions.dll + + + ..\packages\xunit.assert.2.4.0\lib\netstandard2.0\xunit.assert.dll + + + ..\packages\xunit.extensibility.core.2.4.0\lib\net452\xunit.core.dll + + + ..\packages\xunit.extensibility.execution.2.4.0\lib\net452\xunit.execution.desktop.dll + + + + + + + + + + + + + + + {3bf11d95-1a17-444f-97a8-5536fcc8c015} + TupleStudy + + + + + + + + + 这台计算机上缺少此项目引用的 NuGet 程序包。使用“NuGet 程序包还原”可下载这些程序包。有关更多信息,请参见 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 {0}。 + + + + + + + \ No newline at end of file diff --git a/ValueTupleStudyTest/packages.config b/ValueTupleStudyTest/packages.config new file mode 100644 index 0000000..5d9b8dc --- /dev/null +++ b/ValueTupleStudyTest/packages.config @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/元组学习.sln b/元组学习.sln index 616c273..b8f35d8 100644 --- a/元组学习.sln +++ b/元组学习.sln @@ -3,10 +3,12 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 VisualStudioVersion = 15.0.27428.2043 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TupleStudy", "TupleStudy\TupleStudy.csproj", "{3BF11D95-1A17-444F-97A8-5536FCC8C015}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TupleStudy", "TupleStudy\TupleStudy.csproj", "{3BF11D95-1A17-444F-97A8-5536FCC8C015}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TupleStudyTest", "TupleStudyTest\TupleStudyTest.csproj", "{D8CBDB9A-3EDA-4A6B-BB13-E7765B63717E}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ValueTupleStudyTest", "ValueTupleStudyTest\ValueTupleStudyTest.csproj", "{90707BA8-33B0-4EE7-ABF5-36303F2AAA18}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -21,6 +23,10 @@ Global {D8CBDB9A-3EDA-4A6B-BB13-E7765B63717E}.Debug|Any CPU.Build.0 = Debug|Any CPU {D8CBDB9A-3EDA-4A6B-BB13-E7765B63717E}.Release|Any CPU.ActiveCfg = Release|Any CPU {D8CBDB9A-3EDA-4A6B-BB13-E7765B63717E}.Release|Any CPU.Build.0 = Release|Any CPU + {90707BA8-33B0-4EE7-ABF5-36303F2AAA18}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {90707BA8-33B0-4EE7-ABF5-36303F2AAA18}.Debug|Any CPU.Build.0 = Debug|Any CPU + {90707BA8-33B0-4EE7-ABF5-36303F2AAA18}.Release|Any CPU.ActiveCfg = Release|Any CPU + {90707BA8-33B0-4EE7-ABF5-36303F2AAA18}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE