通常,您希望发送多个值,但是由于使用率低(即仅在一个或两个地方使用),因此很难证明创建新的类型.
元组< ...>和KeyValuePair<,>类型是非常有用的,但没有真正的语言支持他们.
好的,用于元组列表的好方法是创建一个扩展列表并添加自定义添加方法的类型:
例如
public class TupleList<T1,T2> : List<Tuple<T1,T2>>{ public void Add(T1 key,T2 value){ base.Add(Tuple.Create(key,value)); } }
这意味着如果我有一个使用IEnumerable< Tuple< int,string>>的方法,我可以使用以下代码来快速建立列表:
Foo(new TupleList<int,string>{{1,"one"},{2,"two"},{3,"three"}});
这使得将元数值变成元组列表更容易,因为我们不必一直持续说Tuple.Create,并使我们几乎成为一个很好的功能语言语法.
但是当使用元组时,将其放在不同的组件中是有用的.这种扩展方法在这方面可能是有用的:
public static void Unwind<T1,T2>(this Tuple<T1,T2> tuple,out T1 var1,out T2 var2) { var1 = tuple.Item1; var2 = tuple.Item2; }
但是,即使这是令人讨厌的,因为out参数根本不变.也就是说,如果T1是一个字符串,我不能发送一个对象变量,即使它们是可分配的,当我可以用手去解除否则.我不能提出一个理由,为什么你可能想要这种差异,但如果它在那里,我看不出你为什么要失去它.
任何人都有其他的提示来制作工作元组,或元组像对象在C#中更容易?
元组的一个重要的潜在用途可能是通用的记忆.这在F#的语言中非常容易,但在C#中很难.
我正在使用Tuples提供一个MethodBase和一个令牌数组(常量,对象或参数标记),提供给一个动态构建的对象来构造某些成员字段.
由于我想使API消费者的语法变得更加容易,所以我创建了可以使用ConstructorInfo或MethodInfo和对象的params数组的Add方法.
编辑:
埃里克·利珀特像往常一样有很好的动机,在这里使用元组,他甚至说我怀疑真的不支持:
What requirement was the tuple designed to solve?
解决方法
在C#中,您可以使用闭包的通用类型(即Tuple),这样您就可以更好地了解目标.不要更改代码,但如果您看下面的示例GetTemp返回的意图是更好的.
没有别名:
namespace ConsoleApplication1 { class Program { static void Main(string[] args) { var result = GetTemp(10,10); Console.WriteLine("Temp for {0} is {1}",result.Item2,result.Item1); } // You give a lat & a long and you get the closest city & temp for it static Tuple<double,string> GetTemp(double lat,double @long) { // just for example return Tuple.Create(10d,"Mordor"); } } }
用别名:
namespace ConsoleApplication1 { using CityTemp = Tuple<double,string>; class Program { static void Main(string[] args) { var result = GetTemp(10,result.Item1); } // You give a lat & a long and you get the closest city & temp for it static CityTemp GetTemp(double lat,double @long) { // just for example return new CityTemp(10,"Mordor"); } } }