2010-05-02 44 views
2

如果Dictionary<object, object>myDictionary恰好包含单个项目,检索值对象的最佳方法是什么(如果我不关心关键字)?带有单个项目的字典

if (myDictionary.Count == 1) 
{ 
    // Doesn't work 
    object obj = myDictionary.Values[0]; 
} 

感谢

+2

我很好奇你为什么需要这个... – 2010-05-02 20:57:19

回答

8

取决于无论您希望它失败,如果有多个对象或不是你可以使用

myDictionary.Value.Single();//Will fail if there's more than one 

myDictionary.Value.First();//Will just return the first regardless of the count 
+1

.FirstOrDefault()是最安全的,因为如果没有,它会返回null,并且可以安全地检查null。 – 2010-05-02 20:29:23

+3

@Cylon:但是,由于项目的值为空或者因为没有项目,所以无法确定它是否为空。 – Guffa 2010-05-02 20:34:33

+0

@Gaffa,如果重要,可以通过检查字典中的键数来做出区分。另一方面,我认为创建一个具有相应空值的键是一个错误。 – 2010-05-02 21:12:36

3
object obj = myDictionary.Values.Single(); 
3

我会从来没有为这个假设编码只会是一个。如果你知道总会有一个,那么为什么要使用字典?

+0

我以这种想法来寻找在这种情况下做什么。不幸的是,我的情况正在返回一个Web API的关键和价值。例如,在JSON中,字典将键和值关联在一起,而KeyValuePair将键与“键”相关联,将值与“值”相互关联,而不是彼此关联,而我发现这并不理想。你有什么机会可以扩展你在这个答案中提示的想法? – Ellesedil 2014-05-21 15:27:31

+1

将JSON添加到组合中确实会改变事物;您需要在服务器端建立客户端期望的模型。所以在这种情况下,字典的作品。 – 2014-05-23 11:27:29

0

我认为你可以使用一个迭代器。

myDictionary.GetEnumerator().Current

+1

枚举器在第一个项目之前启动,您必须调用MoveNext前进到第一个项目。 – Guffa 2010-05-02 20:54:11

1

您不能直接或索引中获得的价值,你必须要么知道密钥:

object obj = yourDictionary[theKeyThatYouHappenToKnow]; 

,或者使用枚举:如果您

var en = yourDictionary.GetEnumerator(); 
en.MoveNext(); 
object obj = en.Current.Value; 
en.Dispose(); 

正在使用框架3.5,您还可以使用一些扩展方法,如SingleFirst为您使用枚举器。