随着.net 4 中的Tuple类的增加,我一直试图决定在我的设计中使用它们是否是一个糟糕的选择.我看到它的方式,一个元组可以是编写结果类的快捷方式(我相信还有其他用途).
所以这:
public class ResultType
{
public string StringValue { get; set; }
public int IntValue { get; set; }
}
public ResultType GetAClassedValue()
{
//..Do Some Stuff
ResultType result = new ResultType { StringValue = "A String", IntValue = 2 };
return result;
}
Run Code Online (Sandbox Code Playgroud)
相当于:
public Tuple<string, int> GetATupledValue()
{
//...Do Some stuff
Tuple<string, int> result = new Tuple<string, int>("A String", 2);
return result;
}
Run Code Online (Sandbox Code Playgroud)
因此,抛开我错过了元组点的可能性,是一个Tuple设计选择不好的例子吗?对我来说,它似乎不那么混乱,但不像自我记录和干净.这意味着对于类型ResultType,后面很清楚类的每个部分意味着什么,但你有额外的代码来维护.随着Tuple<string, int>您将需要查找并弄清每一个 …
我已经看到.Net 4中引入了元组,但我无法想象它可以在哪里使用.我们总是可以创建一个Custom类或Struct.
在Tuples之前,我曾经创建一个class及其变量,然后从这个类创建对象,并使该对象成为某些函数的返回类型.
现在用的元组,我可以做同样的在C#7.0,我们可以将元组性质可以理解的名称(这是之前item1,item2等..)
所以现在我想知道,我应该何时使用元组,何时应该在c#7.0中创建一个类?
我正在组合一个应该评估输入的方法,如果满足所有条件则返回true,如果某些测试失败则返回false.如果出现故障,我还希望呼叫者可以获得某种状态消息.
我遇到的设计包括返回bool并为消息使用out(或ref)参数,返回具有bool和string属性的(特别设计的)类的实例,或甚至返回指示pass或特定的enum的枚举错误.什么是从方法中获取所有信息的最佳方法?这些中的任何一个"好"吗?有没有人有其他建议?
通常你想发送多个值,但由于使用率低(即它只在一两个地方使用),很难证明创建一个新类型的合理性.
该Tuple<...>和KeyValuePair<,>类型是非常有用的,但不是他们真正的语言支持.
好吧,一种用于元组列表的好方法是创建一个扩展List并添加自定义add方法的类型:例如
public class TupleList<T1,T2> : List<Tuple<T1,T2>>{
public void Add(T1 key, T2 value){
base.Add(Tuple.Create(key, value));
}
}
Run Code Online (Sandbox Code Playgroud)
这意味着如果我有一个方法IEnumerable<Tuple<int,string>>,我可以使用以下代码快速建立列表,如下::
Foo(new TupleList<int,string>{{1,"one"},{2,"two"},{3,"three"}});
Run Code Online (Sandbox Code Playgroud)
这使得将值变为元组列表变得更容易,因为我们不必经常说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;
}
Run Code Online (Sandbox Code Playgroud)
但即便如此,因为输出参数根本不是变体.也就是说,如果T1是一个字符串,即使它们是可分配的,我也不能发送一个对象变量,否则就像我可以用手展开一样.我无法提出你可能想要这种差异的原因,但如果它存在,我无法理解为什么你会想要失去它.
任何人都有其他技巧来制作工作元组,或者在C#中更容易像元组一样的元组?
元组的一个重要潜在用途可能是通用的memoization.这在F#这样的语言中很容易,但在C#中却很难.
我目前正在使用Tuples提供一个MethodBase和一个标记数组(常量,对象或参数标记),提供给动态构建的对象以构造某些成员字段.
由于我想在API使用者身上简化语法,因此我创建了可以使用a ConstructorInfo或a MethodInfo和params对象数组的Add方法.
编辑:Eric Lippert像往常一样有很好的动机在这里使用元组,他甚至说我怀疑那里真的没有支持: 元组设计要解决的要求是什么?
Perl有能力:
my ($a,$b,$c,$d) = foo();
Run Code Online (Sandbox Code Playgroud)
其中foo返回4个变量,而不是在同一时间进行指定一个.C#中有类似的东西吗?
我希望在C#中看到的是关于元组的更好的语法,例如.
var rgb = (1.0f, 1.0f, 1.0f);
// Inferred to be Tuple<float, float, float>
// Translated to var rgb = Tuple.Create(1.0f, 1.0f, 1.0f)
Run Code Online (Sandbox Code Playgroud)
和
var x, y, z = rgb;
// Translated to:
// float x = rgb.Item1;
// float y = rgb.Item2;
// float z = rgb.Item3;
Run Code Online (Sandbox Code Playgroud)
C#语言中有什么禁止这个,或者实现它太难/不现实吗?也许还有其他语言功能会与此直接冲突?
请注意,我不是在询问这是否在微软雷达上,或者即使它与他们对C#的愿景保持一致,只是理论上它有明显的阻挡剂.
编辑 以下是其他CLI语言的一些示例
// Nemerle - will use a tuple type from a language specific runtime library
def colour = (0.5f, 0.5f, 1.0f);
def (r, g, b) = colour;
// F# …Run Code Online (Sandbox Code Playgroud) 我们一直在讨论元组及其各种可能的用途。在几乎所有情况下,这听起来像是邪恶的根源,它使设计变得更糟,并且通常在任何可以使用它的地方都需要一个专门的类而不是元组。
据说它与 DB 很接近,但在 db 持久性逻辑代码中也很难找到 Tuple 的用途。
有没有人在现实世界中使用 Tuple 的任何好的样本,最好更接近一些现实世界的域模型问题或任何实际使用。
我有两个问题.我想知道在C#库中是否有一个简单的类来存储值对而不是一个,这样我就可以在列表的同一节点中存储一个类和一个整数.我认为最简单的方法是创建一个容器类,但每次都是额外的工作.我想知道我是否应该这样做.我知道在.NET的更高版本(我使用的是3.5)中,我可以存储有元组,但这对我来说是不可用的.
我想更大的问题是使用字典存储整数类映射的内存缺点是什么,即使我不需要在O(1)中访问并且只能搜索列表?哈希表的最小大小是多少?我应该制作我需要的包装类吗?
这个问题已在这里得到答案
我试图在我的应用程序中使用Tuple.所以我想区分元组,字典和列表.
Dictionary<int, string> dic = new Dictionary<int, string>();
Tuple<int, string> tuple = new Tuple<int, string>();
List<int> list = new List<int>();
Run Code Online (Sandbox Code Playgroud)
这三者有什么区别?