|
|
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
|
|
|
}
|
|
|
}
|