通常你想发送多个值,但由于使用率低(即它只在一个或两个地方使用),很难证明创建一个新类型是合理的。
Tuple<...>
和 KeyValuePair<,>
type 非常有用,但是它们没有真正的语言支持。
好吧,用于元组列表的一个不错的技巧是创建一个扩展列表的类型并添加自定义添加方法: 例如
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# 中很难。
我目前正在使用元组来提供一个 MethodBase 和一个标记数组(常量、对象或参数标记),提供给动态构建的对象以构造某些成员字段。
因为我想让 API 使用者的语法更简单,所以我创建了可以采用 ConstructorInfo
的 Add 方法。或 MethodInfo
和对象的参数数组。
编辑: 像往常一样,Eric Lippert 在这里使用 Tuples 的动机非常好,他甚至说了我怀疑真的没有支持的话: 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, 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 CityTemp GetTemp(double lat, double @long)
{
// just for example
return new CityTemp(10, "Mordor");
}
}
}
关于c# - 在 C# 中使用元组更容易的任何提示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4269718/