Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# IList<;KeyValuePair>;vs IDictionary在WCF中充当[DataMember]_C#_Wcf_List_Dictionary - Fatal编程技术网

C# IList<;KeyValuePair>;vs IDictionary在WCF中充当[DataMember]

C# IList<;KeyValuePair>;vs IDictionary在WCF中充当[DataMember],c#,wcf,list,dictionary,C#,Wcf,List,Dictionary,我有一个必须使用WCF传递的字典数据结构。为此,我使用get和set方法创建了一个成员属性。我基本上可以实现相同的功能,该属性为: IDictionary<keyType, valueType> IDictionary 或者 IList 我看不出有什么强有力的理由选择一个而不是另一个。我能想到的一个温和的原因是: IDictionary—阅读代码的人会认为IDictionary更有意义,因为数据结构是一个字典,但就通过WCF传递的内容而言,它们都是相同的 有人能想出一个选择IL

我有一个必须使用WCF传递的字典数据结构。为此,我使用get和set方法创建了一个成员属性。我基本上可以实现相同的功能,该属性为:

IDictionary<keyType, valueType>
IDictionary
或者

IList
我看不出有什么强有力的理由选择一个而不是另一个。我能想到的一个温和的原因是:

IDictionary—阅读代码的人会认为IDictionary更有意义,因为数据结构是一个字典,但就通过WCF传递的内容而言,它们都是相同的


有人能想出一个选择IList的理由吗?如果没有,我就用IDictionary。

这取决于您的消费者。我会考虑最可能的用例,并使它们的API尽可能简单。边缘案例始终可以通过值集合迭代字典


不要让他们去想它。如果术语词典是操作的结果,那么使用带有名称的类型是非常有用的

这取决于你的消费者。我会考虑最可能的用例,并使它们的API尽可能简单。边缘案例始终可以通过值集合迭代字典


不要让他们去想它。如果术语词典是操作的结果,那么使用带有名称的类型是非常有用的

基于使用而不是实现来设计接口

如果类的使用者需要遍历整个集合,请使用
IEnumerable
。如果他们应该能够修改结果,并且需要基于索引的访问,则返回
IList
。如果他们需要特定的项,并且只有一个有用的键值,则返回
IDictionary


也可以这样编写内部代码:)

基于使用而不是实现来设计接口

如果类的使用者需要遍历整个集合,请使用
IEnumerable
。如果他们应该能够修改结果,并且需要基于索引的访问,则返回
IList
。如果他们需要特定的项,并且只有一个有用的键值,则返回
IDictionary


也可以这样编写内部代码:)

如果keyValuePairs集合需要唯一的键,则可以使用dictionary。
如果同一个键可以出现在多个keyValuePair中,请使用Ilist/ienumerable。

如果keyValuePair集合需要唯一键,则可以使用dictionary。
如果同一个键可以出现在多个keyValuePair中,请使用Ilist/ienumerable。

使用者是我自己的代码,属性的唯一用途是通过WCF使数据结构可序列化。getter setter所做的唯一一件事就是枚举结构的成员,因此IEnumerable的替代方案似乎是最简单的工作,这总是很好:-)@David:“该属性的唯一目的是使数据结构可以通过WCF序列化”。在没有看到代码的情况下,我不能声称完全理解您的场景,但听起来您的设计中可能有一些混合的抽象层次,这导致类似这样的决策过于复杂。您能对这一评论发表意见吗?@David:不幸的是,没有代码可以查看,我只能推测:)不过,我之所以这么说,是因为我对代码的想象开始变得模糊。这样的财产属于哪一类?属性之所以存在,是因为它们在类的上下文中对其使用者有意义。如果您有一个属性不能很好地适应类的上下文,那么可能它不属于该类,或者您的类做了太多的事情,或者您的抽象集完全错误。该属性位于什么样的类中,该类的工作是什么?使用者是我自己的代码,该属性的唯一用途是使数据结构可由WCF序列化。getter setter所做的唯一一件事就是枚举结构的成员,因此IEnumerable的替代方案似乎是最简单的工作,这总是很好:-)@David:“该属性的唯一目的是使数据结构可以通过WCF序列化”。在没有看到代码的情况下,我不能声称完全理解您的场景,但听起来您的设计中可能有一些混合的抽象层次,这导致类似这样的决策过于复杂。您能对这一评论发表意见吗?@David:不幸的是,没有代码可以查看,我只能推测:)不过,我之所以这么说,是因为我对代码的想象开始变得模糊。这样的财产属于哪一类?属性之所以存在,是因为它们在类的上下文中对其使用者有意义。如果您有一个属性不能很好地适应类的上下文,那么可能它不属于该类,或者您的类做了太多的事情,或者您的抽象集完全错误。该属性居住在什么样的类中,该类的工作是什么?
IList<KeyValuePair<keyType, valueType>>