C# 什么是成对请求对象的最直接的方式?
因此,我必须设计一个类,该类处理成对对象的集合。对象之间存在一对一映射。我希望类的客户机在使用我的类之前已经建立了这个映射 我的问题是,让我的类的用户向我提供这些信息的最佳方式是什么 是要像这样收集一对吗C# 什么是成对请求对象的最直接的方式?,c#,usability,C#,Usability,因此,我必须设计一个类,该类处理成对对象的集合。对象之间存在一对一映射。我希望类的客户机在使用我的类之前已经建立了这个映射 我的问题是,让我的类的用户向我提供这些信息的最佳方式是什么 是要像这样收集一对吗 MyClass(IEnumerable<KeyValuePair<Object, Object>> objects) MyClass(IEnumberable<Object> x, IEnumerable<Object> y) MyClass
MyClass(IEnumerable<KeyValuePair<Object, Object>> objects)
MyClass(IEnumberable<Object> x, IEnumerable<Object> y)
MyClass(IEnumerable对象)
或者像这样分开收藏
MyClass(IEnumerable<KeyValuePair<Object, Object>> objects)
MyClass(IEnumberable<Object> x, IEnumerable<Object> y)
MyClass(IEnumerable x,IEnumerable y)
还是有其他选择
我喜欢第一种,因为这种关系是明确的,我不喜欢它,因为它给客户带来了额外的工作
我喜欢第二种,因为类型更原始,需要更少的工作,我不喜欢它,因为映射是不显式的。我得假设顺序是正确的
请发表意见?第一种方法是我的首选方法,因为第二种方法的一个序列可能比另一个长-它不能保持所需的1:1映射。在我看来,第二种方法给了你和客户更多的工作要做。第一种选择更安全,更难出错。每次我都会选择第一个选项或类似的选项。我想你必须选择选项1。必须涉及明确的关系,否则您只是自找麻烦。如果您有权访问它,请使用
Tuple
。如果没有,只需编写自己的通用元组
或对
类即可。我会避免使用KeyValuePair
,只是因为它冗长且与Dictionary
有关联,我更喜欢您提到的两个KeyValuePair,因为它更具表现力并保持对象之间的关系
但是我更愿意创建一个类来保存对您的两个对象的引用。在我看来,这更具可读性,而且创建一个额外的类或结构来表达您的实际操作也不会有什么坏处
(伪代码)
类MyPair
{
公共A型;
公共B类2;
}
MyClass(IEnumerable对象)
在一些答案中提到了Tuple
,它与KeyValuePair一样可读,但更灵活,因为它可以包含两个以上的参数
[编辑-晚上睡个好觉后更深入地了解元组/类]
在.NET4中,您应该使用
元组。更多关于MSDN类的信息。我会使用第二个版本(因为它更简单)+注释+静态/动态检查。如果可以使用代码约定,请尝试确保集合的长度相同,而不是null。如果没有,则对Debug.Assert执行相同的操作,如果。。。抛出ArgumentException
。或者,您可以创建自己的包含该对的对象,但是如果您想要为该对的成员使用泛型,那么就变得更加困难了。另外,当您创建一个要存储在容器中的对象时,您必须正确地实现GetHashCode
,Equals
,等等。第一本“有效的C#”书中有一个关于这个的项目
作为一般规则,我不希望过度设计方法签名。我通常提供这两种签名,KeyValuePair构造函数委托给2-arg构造函数。两全其美。我当然更喜欢第一个。正如您所说的,关联是显式的,并且它比第二个更不容易出错,您需要测试两个集合是否具有相同的长度。当然,根据您正在构建的实际类,提供/两种/方式实际上可能是合适的
有一件事,如果您使用.NET4.0,我建议使用Tuple
而不是KeyValuePair。我喜欢第一种方法,原因有两个
如果他们已经在一个Dictionary对象中存储了他们的关系,他们可以按原样移交Dictionary,不需要额外的代码
如果他们使用自己的自定义存储,那么使用yield语句在IEnumerable中为您提供KeyValuePairs非常容易
大概是这样的:
IEnumerable<KeyValuePair<Object,Object>> GetMappedPairs()
{
foreach( var pair in _myCustomData )
{
yield return new KeyValuePair{Key = pair.ID, Value = pair.Data};
}
}
// totally hypothetical example
var stockReturns = StockReturns.Create(prices, p => p.Close, p => p.PrevClose);
IEnumerable GetMappedPairs()
{
foreach(myCustomData中的var对)
{
返回新的KeyValuePair{Key=pair.ID,Value=pair.Data};
}
}
使用您的方法的开发人员不容易理解选项2,因此需要文档和注释来解释如何使用它
顺便说一句,最好将方法声明为泛型方法,而不是硬编码KeyValuePair
MyClass<TKey,TValue>( IEnumerable<KeyValuePair<TKey,TValue>> pairs );
MyClass(IEnumerable对);
可能值得考虑为什么要公开可枚举项。您可以使用Add(objecta,objectb)方法来完全隐藏处理对的内部方式。然后,客户机可以设置自己的方法,将关系添加为集合或单个
当然,如果您仍然需要一个可枚举的方法,那么第一个选项可能是最好的:显式关系。但是,考虑使用或制作元组或配对类型来代替KEYVALIMPEAIR,假设它们之间的关系不是价值本质的关键。 现在,如果你做了这样的事情,会怎么样?
MyClass(IEnumerable<KeyValuePair<Object, Object>> objects)
MyClass(IEnumberable<Object> x, IEnumerable<Object> y)
我喜欢第一个也是出于同样的原因,这种关系是明确的。由于KeyValuePair在整个框架中都很常见,我看不出有任何“额外的工作”。它可能有一个缺点,即KeyValuePair推断T2以某种方式由T1设置关键帧,如果它们之间的关系更具符号性,您可以滚动您自己的类型(即Pair)…NET 4:仅用于参数。为什么要使用Tuple而不是您自己的结对类?@korbinian——这是我的想法,但MSDN通过包含一个指向包含.NET 3.5的“以前版本”的链接而抛弃了我。不幸的是,这里的评论(我没有看)真实地表明了一个事实,那就是它只是.NET4。@Mikael-所以你不必维护一个类