在C#7中,如何从现有元素和新元素生成新的ValueTuple?
在C#7中,我们有在C#7中,如何从现有元素和新元素生成新的ValueTuple?,c#,c#-7.0,valuetuple,C#,C# 7.0,Valuetuple,在C#7中,我们有(a,b,C,…)形式的值元组和它们的解构(通过var(a,b,C,…=(a,b,C,…)) 我有一个(行:,列:)格式的元组,我想使用上一个元组创建一个格式(行:,列:,内容:)的新元组 在Python中,我可以执行以下操作: existing=[1,2] 新=[*现有,3] 或者用口述: existing={'row':1,'column':2} 新={**existing,'content':'1'} C#中是否有类似的模式 我当然可以将元组分解为变量,然后重新组合它
(a,b,C,…)形式的值元组和它们的解构(通过var(a,b,C,…=(a,b,C,…)
)
我有一个(行:,列:)
格式的元组,我想使用上一个元组创建一个格式(行:,列:,内容:)
的新元组
在Python中,我可以执行以下操作:
existing=[1,2]
新=[*现有,3]
或者用口述:
existing={'row':1,'column':2}
新={**existing,'content':'1'}
C#中是否有类似的模式
我当然可以将元组分解为变量,然后重新组合它们:
var (row, column) = (row: 1, column: 2);
var result = (row, column, content: '1');
然而,实际情况更为复杂。我有一个返回现有元组的函数和一个构造新元组的单行函数。如果我将其简化,它将如下所示:
private (int row, int column) ExistingTuple() => (row: 1, column: 2);
private (int row, int column, char content) NewTuple() => (/* What should I do here */ExistingTuple(), content: '1');
为了简单易读,我希望它是一个箭头函数(tf()=>E;
)。如果我将实施我的建议,它将看起来像:
private (int row, int column, char content) NewTuple()
{
var (row, column) = ExistingTuple();
return (row, column, content: '1');
}
有没有更优雅的方法可以做到这一点?您可以将其作为扩展方法编写,尽管听起来可能不像您希望的那样简洁:
publicstatic(T1、T2、T3)TupleAppend(
这个(T1,T2)我,
T3值
) =>
(me.Item1,me.Item2,值);
用作:
var triple = (1, 2).TupleAppend(3);
您还需要为每种大小设置一个重载,如果您想一次添加多个新项,甚至需要更多重载。您可以将其作为扩展方法编写,尽管听起来可能不像您希望的那样简洁:
publicstatic(T1、T2、T3)TupleAppend(
这个(T1,T2)我,
T3值
) =>
(me.Item1,me.Item2,值);
用作:
var triple = (1, 2).TupleAppend(3);
对于每种大小,您还需要一个重载,如果您想一次添加多个新项,则需要更多重载。从设计角度来看,这可能是两种不同的数据类型。(行,列)
元组是实际数据的索引。因此,您可以使用嵌套元组来表达此意图:
private ((int row, int column), char content) EnrichedTuple() =>
(ExistingTuple(), content: '1');
从设计角度来看,这可能是两种不同的数据类型。(行,列)
元组是实际数据的索引。因此,您可以使用嵌套元组来表达此意图:
private ((int row, int column), char content) EnrichedTuple() =>
(ExistingTuple(), content: '1');
我不相信这在目前是可以实现的(尽管我不确定这一点)。或者改成Python!;)我不相信这在目前是可以实现的(尽管我不确定这一点)。或者改成Python!;)如果这是我唯一喜欢的方式。它可读性更强,编写的代码更少。@ChayimFriedman只要你把扩展方法放在一个库中,并且放在一个单独的地方,这样它们就不会弄乱任何东西,你应该只编写一次。与手动分解/重构相比,实际的追加操作更清晰。您也可以使用比TupleAppend
更短的名称。(甚至可能很短,比如a
或其他什么,然后它几乎就像一个操作符。)如果这是我唯一喜欢的方式。它可读性更强,编写的代码更少。@ChayimFriedman只要你把扩展方法放在一个库中,并且放在一个单独的地方,这样它们就不会弄乱任何东西,你应该只编写一次。与手动分解/重构相比,实际的追加操作更清晰。您也可以使用比TupleAppend
更短的名称。(甚至可能很短,比如a
或其他什么,然后它几乎就像一个操作符。)