You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
TupleStudy/TupleStudy/ValueTupleStudy.cs

258 lines
8.6 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System;
using System.Collections.Generic;
using System.Text;
namespace TupleStudy
{
/// <summary>
/// 值元组 学习
/// ValueTuple是C# 7.0的新特性之一,.Net Framework 4.7以上版本可用, 其它版本可以用 nuget 添加System.ValueTuple
/// 值元组也是一种数据结构,用于表示特定数量和元素序列,但是是和元组类不一样的,主要区别如下:
/// 值元组是结构是值类型不是类而元组Tuple是类引用类型
/// 值元组元素是可变的,不是只读的,也就是说可以改变值元组中的元素值;
/// 值元组的数据成员是字段不是属性。
/// </summary>
public class ValueTupleStudy
{
#region 构造函数 创建值元组
/// <summary>
/// 创建0元素的值元组
/// </summary>
public ValueTuple CreateValueTuple()
{
var tuple = new ValueTuple();
return tuple;
}
/// <summary>
/// 创建1元素的值元组
/// </summary>
public ValueTuple<T1> CreateValueTuple<T1>(T1 value)
{
var tuple = new ValueTuple<T1>(value);
return tuple;
}
/// <summary>
/// 创建2元素的值元组
/// </summary>
public ValueTuple<T1,T2> CreateValueTuple<T1,T2>(T1 value1, T2 value2)
{
var tuple = new ValueTuple<T1, T2>(value1, value2);
return tuple;
}
/// <summary>
/// 创建3元素的值元组
/// </summary>
public ValueTuple<T1, T2, T3> CreateValueTuple<T1, T2, T3>(T1 value1, T2 value2, T3 value3)
{
var tuple = new ValueTuple<T1, T2, T3>(value1, value2, value3);
return tuple;
}
/// <summary>
/// 创建4元素的值元组
/// </summary>
public ValueTuple<T1, T2, T3, T4> CreateValueTuple<T1, T2, T3, T4>(T1 value1, T2 value2, T3 value3, T4 value4)
{
var tuple = new ValueTuple<T1, T2, T3, T4>(value1, value2, value3, value4);
return tuple;
}
/// <summary>
/// 创建5元素的值元组
/// </summary>
public ValueTuple<T1, T2, T3, T4, T5> CreateValueTuple<T1, T2, T3, T4, T5>(T1 value1, T2 value2, T3 value3, T4 value4, T5 value5)
{
var tuple = new ValueTuple<T1, T2, T3, T4, T5>(value1, value2, value3, value4, value5);
return tuple;
}
/// <summary>
/// 创建6元素的值元组
/// </summary>
public ValueTuple<T1, T2, T3, T4, T5, T6> CreateValueTuple<T1, T2, T3, T4, T5, T6>(T1 value1, T2 value2, T3 value3, T4 value4, T5 value5, T6 value6)
{
var tuple = new ValueTuple<T1, T2, T3, T4, T5, T6>(value1, value2, value3, value4, value5, value6);
return tuple;
}
/// <summary>
/// 创建7元素的值元组
/// </summary>
public ValueTuple<T1, T2, T3, T4, T5, T6, T7> CreateValueTuple<T1, T2, T3, T4,T5,T6,T7>(T1 value1, T2 value2, T3 value3, T4 value4, T5 value5, T6 value6, T7 value7)
{
var tuple = new ValueTuple<T1, T2, T3, T4, T5, T6, T7>(value1, value2, value3, value4, value5, value6, value7);
return tuple;
}
/// <summary>
/// 创建8元素的值元组
/// </summary>
public ValueTuple<T1, T2, T3, T4, T5, T6, T7, TRest> CreateValueTuple<T1, T2, T3, T4, T5, T6, T7, TRest>(T1 value1, T2 value2, T3 value3, T4 value4, T5 value5, T6 value6, T7 value7, TRest restValue) where TRest : struct
{
var tuple = new ValueTuple<T1, T2, T3, T4, T5, T6, T7, TRest>(value1, value2, value3, value4, value5, value6, value7, restValue);
return tuple;
}
#endregion
#region 静态Create方法 创建值元组
/// <summary>
/// 创建0元素的值元组
/// </summary>
public ValueTuple GetValueTuple()
{
var tuple = ValueTuple.Create();
return tuple;
}
/// <summary>
/// 创建1元素的值元组
/// </summary>
public ValueTuple<T1> GetValueTuple<T1>(T1 item1)
{
var tuple = ValueTuple.Create(item1);
return tuple;
}
/// <summary>
/// 创建2元素的值元组
/// </summary>
public ValueTuple<T1, T2> GetValueTuple<T1, T2>(T1 item1, T2 item2)
{
var tuple = ValueTuple.Create(item1, item2);
return tuple;
}
/// <summary>
/// 创建3元素的值元组
/// </summary>
public ValueTuple<T1, T2, T3> GetValueTuple<T1, T2, T3>(T1 item1, T2 item2, T3 item3)
{
var tuple = ValueTuple.Create(item1, item2, item3);
return tuple;
}
/// <summary>
/// 创建4元素的值元组
/// </summary>
public ValueTuple<T1, T2, T3, T4> GetValueTuple<T1, T2, T3, T4>(T1 item1, T2 item2, T3 item3, T4 item4)
{
var tuple = ValueTuple.Create(item1, item2, item3, item4);
return tuple;
}
/// <summary>
/// 创建5元素的值元组
/// </summary>
public ValueTuple<T1, T2, T3, T4, T5> GetValueTuple<T1, T2, T3, T4, T5>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5)
{
var tuple = ValueTuple.Create(item1, item2, item3, item4, item5);
return tuple;
}
/// <summary>
/// 创建6元素的值元组
/// </summary>
public ValueTuple<T1, T2, T3, T4, T5, T6> GetValueTuple<T1, T2, T3, T4, T5, T6>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6)
{
var tuple = ValueTuple.Create(item1, item2, item3, item4, item5, item6);
return tuple;
}
/// <summary>
/// 创建7元素的值元组
/// </summary>
public ValueTuple<T1, T2, T3, T4, T5, T6, T7> GetValueTuple<T1, T2, T3, T4, T5, T6, T7>(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;
}
/// <summary>
/// 创建8元素的值元组
/// </summary>
public (T1, T2, T3, T4, T5, T6, T7, TRest) GetValueTuple<T1, T2, T3, T4, T5, T6, T7, TRest>(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
#region 优化解构ValueTuple
//注意通过var (x, y)或者(var x, var y)来解析值元组元素构造局部变量,
//同时可以使用符号”_”来忽略不需要的元素。
/// <summary>
/// 简化值元组创建语法
/// </summary>
public (int userId, string userName, int userAge) SingleCreateValueTuple()
{
//回为函数返回值已经重命名,创建时再次命名已没有意义
//return (userId: 1, userName: "wanggaofeng", userAge: 18);
return (1, "王高峰",18);
}
#endregion
#region 方法返回多个值
/// <summary>
/// 方法返回一组定义了类型并已经命名的数据
/// </summary>
/// <returns>
/// 定义了类型并已经命名的一组数据
/// </returns>
public (int userId, string userName, uint userAge) GetNamedValueTuple()
{
var tuple = ValueTuple.Create<int, string, uint>(1, "王高峰", 18);
return tuple;
}
/// <summary>
/// 方法返回一组只定义,未命名的的数据
/// </summary>
/// <returns>
/// 只定义类型,未命名的一组数据
/// </returns>
public (int, string, uint) GetUnNamedValueTuple()
{
var tuple = ValueTuple.Create<int, string, uint>(1, "王高峰", 18);
return tuple;
}
#endregion
#region ValueTuple做为方法的参数
/// <summary>
/// ValueTuple做为方法的参数
/// </summary>
public bool ValueTupleAsParameterForMether(object valueTuple)
{
try
{
var student = (ValueTuple<int, string, int>)valueTuple;
return true;
}
catch
{
return false;
}
}
#endregion
}
}