Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#7中,如何从现有元素和新元素生成新的ValueTuple?_C#_C# 7.0_Valuetuple - Fatal编程技术网

在C#7中,如何从现有元素和新元素生成新的ValueTuple?

在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#中是否有类似的模式 我当然可以将元组分解为变量,然后重新组合它

在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#中是否有类似的模式

我当然可以将元组分解为变量,然后重新组合它们:

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
或其他什么,然后它几乎就像一个操作符。)