59

我有以下声明:

Dictionary<string, Dictionary<string, string>> like = new Dictionary<string, Dictionary<string, string>>();

我需要取出第一个元素,但不知道键或值。最好的方法是什么?

4

9 回答 9

118

注意First这里调用其实是调用了IEnumerable的一个Linq扩展,由Dictionary<TKey,TValue>. 但是对于字典来说,“第一”没有明确的含义。根据这个答案,添加的最后一项最终是“第一个”(换句话说,它的行为类似于Stack),但这是特定于实现的,它不是保证的行为。换句话说,假设您将通过调用First来获取任何已定义的项目,那就是自找麻烦——使用它应该被视为类似于从 Dictionary 中获取一个随机项目,如下 Bobson 所述。但是,有时这很有用,因为您只需要任何字典中的项目。


只需使用 Linq First()

var first = like.First();
string key = first.Key;
Dictionary<string,string> val = first.Value;

请注意,在这种情况下,在First字典上使用会为您提供, 。KeyValuePairKeyValuePair<string, Dictionary<string,string>>


另请注意,您可以First通过将其与 Linq 结合使用来获得特定含义OrderBy

var first = like.OrderBy(kvp => kvp.Key).First();
于 2012-12-20T20:28:35.177 回答
29

对于任何想要以无 linq 方式从字典中获取元素的人来说

var d = new Dictionary<string, string>();
d.Add("a", "b");
var e = d.GetEnumerator();
e.MoveNext();
var anElement = e.Current;
// anElement/e.Current is a KeyValuePair<string,string>
// where Key = "a", Value = "b"

我不确定这是否是特定于实现的,但是如果您的 Dictionary 没有任何元素,Current则将包含 aKeyValuePair<string, string>其中 key 和 value 都是null

(我查看了 linq 提出这个First方法背后的逻辑,并通过 进行了测试LinqPad 4

于 2013-05-14T18:21:43.710 回答
16

虽然您可以使用First(),但字典本身没有顺序。请改用OrderedDictionary。然后你可以做FirstOrDefault。这样就有意义了。

于 2012-12-20T20:30:39.270 回答
5

编辑:使用 OrderedDictionary。

最好用于FirstOrDefault()检索第一个值。

前任:

var firstElement = like.FirstOrDefault();
string firstElementKey = firstElement.Key;
Dictinary<string,string> firstElementValue = firstElement.Value;
于 2012-12-20T20:34:52.147 回答
2
using System.Linq;

Dictionary<string, Dictionary<string, string>> like = new Dictionary<string, Dictionary<string, string>>();
Dictionary<string, string> first = like.Values.First();
于 2012-12-20T20:29:24.203 回答
2

字典没有定义项目的顺序。如果您只需要一个项目使用KeysValues字典的属性来选择一个。

于 2012-12-20T20:30:15.297 回答
0

找不到在字典中找到第一个元素的简单方法:)

 Dictionary<string, Dictionary<string, string>> like = 
 newDictionary<string,Dictionary<string, string>>();

 foreach(KeyValuePair<string, Dictionary<string, string>> _element in like)
 {
   Console.WriteLine(_element.Key); // or do something
   break;
 }
于 2019-01-29T13:53:27.287 回答
0

转换为数组

var array = like.ToArray();
var first = array[0];
于 2020-05-14T08:05:12.760 回答
0

在性能、高兼容性(2.0、3.0、3.5、4.0、4.5、4.5.1、4.5.2、4.6、4.6.1、4.6.2、4.7、4.7.1、4.7 .2, 4.8) 并且易于实施。

今天保存!!它不仅仅是一个物品副本,这是一个收藏的物品参考!买吧!!

string [] arrayString = new string[like.Count];
like.Values.CopyTo( arrayString,0 );

arrayString[0] //First

参考:

https://docs.microsoft.com/es-es/dotnet/api/system.collections.generic.icollection-1.copyto?view=net-5.0

https://social.msdn.microsoft.com/Forums/vstudio/en-US/dc5e4242-64d3-45ac-bdea-cf4f3d9abdbb/icollectioncopyto-vs-arraylisttoarray?forum=netfxbcl

于 2021-10-31T20:42:23.593 回答