在 C# 7 中,如何从现有元素和新元素创建新的值元组?



在 C# 7 中,我们有形式为(a, b, c, ...)的值元组并解构它们(通过var (a, b, c, ...) = (a, b, c, ...)(。

我有一个表单(row: <int>, column: <int>)元组,我想使用前一个元组创建表单(row: <int>, column: <int>, content: <char>)的新元组

在Python中,我可以做到:

existing = [1, 2]
new = [*existing, 3]

或用字典:

existing = {'row':1, 'column':2}
new = {**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');

为了简单性和可读性,我希望它作为一个箭头函数(T F() => E;(。如果我实施我的建议,它看起来像:

private (int row, int column, char content) NewTuple()
{
var (row, column) = ExistingTuple();
return (row, column, content: '1');
}

有没有更优雅的方法可以做到这一点?

你可以把它写成一个扩展方法,虽然听起来可能不像你想要的那么简洁:

public static (T1, T2, T3) TupleAppend<T1, T2, T3>(
this (T1, T2) me,
T3 value
) =>
(me.Item1, me.Item2, value);

用作:

var triple = (1, 2).TupleAppend(3);

您还需要为每个大小重载一个重载,如果您想一次添加多个新项目,甚至需要更多重载。

从设计的角度来看,这可能是两种不同的数据类型。(row, col)元组是实际数据的索引。因此,您可以使用嵌套元组来表达此意图:

private ((int row, int column), char content) EnrichedTuple() => 
(ExistingTuple(), content: '1');

最新更新