从字典<string, string>中获取第一个键。

65

我正在使用一个 System.Collections.Generic.Dictionary<string, string>

我想从这个字典中返回第一个键。我尝试了 dic.Keys[0],但是在 Keys 属性上(它是一个 KeyCollection 对象)我只有一个枚举器。

我是否必须枚举所有的键才能得到第一个键?


正如你们中的许多人所说,没有所谓的“第一”。我认为我需要更加清晰地表达:您可以在查询字符串中指定一个区域,然后我会检查它是否在我的区域列表中。如果不在(用户编辑了查询字符串),我只需将其设置为已知的“第一个”区域。 - Michel
可能是重复的问题:从字典中获取第一个元素 - Michael Freidgeim
@MichaelFreidgeim 这可能是一个重复的问题,但是这个问题是在3年前提出的,所以那时它不可能是一个重复的问题。 - Michel
“可能重复”是一种清理方式 - 关闭类似的问题并保留最佳答案。日期不是必要的。请参见http://meta.stackexchange.com/questions/147643/should-i-vote-to-close-a-duplicate-question-even-though-its-much-newer-and-ha 如果您认为需要澄清,请在http://meta.stackexchange.com/questions/281980/add-clarification-link-to-possible-duplicate-automated-comment上投票。 - Michael Freidgeim
5个回答

125

假设您正在使用 .NET 3.5:

dic.Keys.First();
注意,字典中的键/值对遍历顺序没有保证。你可能会发现在很多情况下,你得到的是你放入字典的第一个键 - 但你绝对不能依赖于这一点。正如Skirwan所说的那样,没有“第一个”的概念。基本上,上面的代码会给你“字典中的一个键” - 这就是所有保证的内容。
(如果你不知道字典是否为空,你可以使用 FirstOrDefault。)

1
不错,我在智能感知中没有看到它,所以我认为这是一个不可 LINQ 化的对象(我太懒了 :))。 - Michel
2
在.NET 2及更早版本中,您如何执行此操作? - ina
2
@WebDrive:如果你想要第一个value,只需使用dic.Values.First()即可,无需通过key。 - Jon Skeet
7
我遇到了CS1061错误。需要添加“using System.Linq;”才能成功。 - Jarekczek
@Jarekczek:是的,你需要。对于 LINQ 的答案,我认为这是理所当然的 :) - Jon Skeet
显示剩余4条评论

23

在字典中,“第一”这个概念并不真正适用,因为条目之间没有排序;任何插入或删除操作都可能彻底改变键的顺序。


3
如果正确,请点赞。字典中的顺序不能保证。也许使用SortedDictionary会更有用。 - Greg D
同上 - Michel
首先,当然是加密的,因为设计上不希望顺序对所有方面都产生影响,例如安全和防止依赖顺序。但有些情况下仍可能需要这种顺序。我能想到的第一个情况是当你只想从中提取任何旧的键/值时。另一个情况可能是,如果我们知道只有一个元素,并且我们只想返回它,而不必在代码中添加语法膨胀,这也可能导致在维护该代码时出现混淆。 - osirisgothra

15
首先,不需要枚举所有条目 - 只需枚举第一项即可。
IEnumerator enumerator = dictionary.Keys.GetEnumerator();
enumerator.MoveNext();
object first = enumerator.Current;
理想情况下,应该检查MoveNext()是否成功(它会返回一个bool类型),否则调用Current方法可能会抛出异常。
请注意,字典的顺序未指定。这意味着“第一个”项实际上可能是任何键,并且在后续调用中可能不同(尽管在实践中通常不会),并且在添加和删除字典项时肯定会更改。

9
似乎有点过头了,但是怎么样?
foreach (<Type> k in dic.Keys)
    return k;

2
我们可以使用 linq 技术。
var key = dic.Take(1).Select(d => d.Key).First()

或者我们可以使用另一个搜索。
var myList = dic.Take(1).Where(d => d.Key.Contains("Heaven")).ToList();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接