在 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');