从字典中获取第一个元素

cdu*_*dub 44 .net c# asp.net .net-3.5

我有以下声明:

Dictionary<string, Dictionary<string, string>> like = new Dictionary<string, Dictionary<string, string>>();
Run Code Online (Sandbox Code Playgroud)

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

McG*_*gle 95

注意,在First这里调用实际上是调用IEnumerable的Linq扩展,它由Dictionary<TKey,TValue>.实现.但对于词典,"第一"没有明确的含义.根据这个答案,最后添加的项目最终是"First"(换句话说,它的行为类似于Stack),但这是特定于实现的,它不是保证的行为.换句话说,假设你将通过调用获得任何定义的项目First将是乞求麻烦 - 使用它应被视为类似于从字典中获取随机项目,如下面的Bobson所述.但是,有时候这很有用,因为你只需要字典中的任何项目.


只需使用Linq First():

var first = like.First();
string key = first.Key;
Dictionary<string,string> val = first.Value;
Run Code Online (Sandbox Code Playgroud)

请注意,在这种情况下,在First字典上使用会给出一个.KeyValuePairKeyValuePair<string, Dictionary<string,string>>


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

var first = like.OrderBy(kvp => kvp.Key).First();
Run Code Online (Sandbox Code Playgroud)

  • @dbaseman字典没有第一对.仅仅因为你在`Dictionary'上调用`First`并不意味着你实际上得到了字典中的第一项.你在字典里有***项目,但不是第一项.没有第一项,因为词典是无序的.这种类型的答案只会进一步损害OP,因为他们将继续相信他们实际上正在获得"第一"项目,即使不存在这样的事情.这个问题的正确答案是没有第一项. (2认同)

Jes*_*ing 22

对于任何人来此想要一个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"
Run Code Online (Sandbox Code Playgroud)

我不确定这是否是特定于实现的,但如果您的Dictionary没有任何元素,Current则将包含KeyValuePair<string, string>键和值都在的位置null.

(我查看了linq的First方法背后的逻辑,并通过测试LinqPad 4)

  • 枚举器是IDisposable对象,因此您应在此处使用using结构。 (2认同)

RAS*_*RAS 15

虽然你可以使用First(),但字典本身没有订单.请改用OrderedDictionary.然后你就可以做到FirstOrDefault.这样它就会有意义.


nar*_*eni 5

编辑:使用 OrderedDictionary。

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

前任:

var firstElement = like.FirstOrDefault();
string firstElementKey = firstElement.Key;
Dictinary<string,string> firstElementValue = firstElement.Value;
Run Code Online (Sandbox Code Playgroud)