元组是不可变的,因此您无法更改其值。当您有不可变对象时,更改它们的方法是返回一个更改了所需属性的新对象。因此,如果你想坚持使用元组,你可以这样做:
public static class TupleExtensions {
public static Tuple<T1, T2, T3>
WhereItem3Is<T1, T2, T3>(this Tuple<T1, T2, T3> self, T3 newValue) {
return Tuple.Create(self.Item1, self.Item2, newValue);
}
// other methods for Tuple<,,> or other Tuples...
}
并像这样使用它:
var t = Tuple.Create(1, 2, 3);
// ...
t = t.WhereItem3Is(4);
但编写所有这些方法有点痛苦。因此,如果您需要很多,最好这样做:
var t = Tuple.Create(1, 2, 3);
t = Tuple.Create(t1.Item1, t1.Item2, 4);
您甚至可以有一个包装类型,用于从代码中的不同位置引用元组,以便任何“更改”都可见:
var t = Tuple.Create(1, 2, 3);
var r = new Ref<Tuple<int, int, int>>(t);
// share r ...
r.Value = Tuple.Create(r.Value.Item1, r.Value.Item2, 4);
...
public class Ref<T> {
public T Value { get; set; }
public Ref(T value) { Value = value; }
}
然而这一切却让人感觉非常awkward。也许你可以更好地解释基本的您遇到的问题,以便提供更好的答案。也许您实际上并不需要元组,只是需要一些更特定于您的域的东西。