从字典中获取第一个元素

Posted

技术标签:

【中文标题】从字典中获取第一个元素【英文标题】:Get first element from a dictionary 【发布时间】:2012-12-08 10:23:54 【问题描述】:

我有以下声明:

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

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

【问题讨论】:

为字典定义“first”。 字典是无序的。 相关(非 Skeet):***.com/q/436954/1001985 当您知道字典中只有一个项目时,使用 First() 是有意义的,因为您已经对字典进行了 .Count。然后你不需要对一个项目做一个 foreach 循环,只需使用 First() @LouiseEggleton 这正是我使用此解决方案的方式。感谢您对 OP 的问题保持冷静。 【参考方案1】:

在性能、高兼容性(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

【讨论】:

虽然这段代码可以回答这个问题,但最好包含一些上下文,解释它是如何工作的以及何时使用它。从长远来看,纯代码的答案没有用处。【参考方案2】:
using System.Linq;

Dictionary<string, Dictionary<string, string>> like = new Dictionary<string, Dictionary<string, string>>();
Dictionary<string, string> first = like.Values.First();

【讨论】:

.Values.First() 不存在...您在使用 System.Collection.Generic 吗? “不存在”是什么意思?请记住,First() 是一个扩展方法,因此您必须在 using 指令中包含 using System.Linq【参考方案3】:

转换为数组

var array = like.ToArray();
var first = array[0];

【讨论】:

【参考方案4】:

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

 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;
 

【讨论】:

【参考方案5】:

注意这里调用First其实就是调用IEnumerable的一个Linq扩展,由Dictionary&lt;TKey,TValue&gt;实现。但是对于字典来说,“第一”没有明确的含义。根据this answer,添加的最后一项最终成为“第一个”(换句话说,它的行为类似于堆栈),但这是特定于实现的,它不是保证 行为。换句话说,assume 你将通过调用 First 来获得任何已定义的项目,这将是自找麻烦——使用它应该被视为类似于获得一个random 来自字典的项目,如下 Bobson 所述。但是,有时这很有用,因为您只需要字典中的 any 项。


只需使用 Linq First():

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

请注意,在字典上使用First 会得到KeyValuePair,在本例中为KeyValuePair&lt;string, Dictionary&lt;string,string&gt;&gt;


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

var first = like.OrderBy(kvp => kvp.Key).First();

【讨论】:

我建议进行编辑以将 val 更改为正确的值(因为它是一个字符串),但我猜它被拒绝了? @Eve - 是的,因为 val 是 Dictionary&lt;string, string&gt;,而 likeDictionary&lt;string, Dictionary&lt;string, string&gt;&gt; 哦,对不起,打扰了。 @dbaseman 字典没有第一对。仅仅因为您在Dictionary 上调用了First 并不意味着您实际上得到了字典中的第一项。您在字典中有 an 项,但没有第一项。没有第一项,因为字典是无序的。这种类型的答案只会进一步损害 OP,因为他们将继续相信他们实际上得到了“第一个”项目,即使不存在这样的事情。这个问题的正确答案是没有第一项。 @Servy - 我能想到的只有一种情况,在字典上调用First 是值得的:当您想要访问应该相同的键或值对象的属性时所有这些(即对子字典中父的反向引用)。【参考方案6】:

对于任何想要通过无 linq 方式从字典中获取 an 元素的人

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 将包含一个 KeyValuePair&lt;string, string&gt;,其中键和值都是 null

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

【讨论】:

枚举器是IDisposable 对象,所以你应该在这里使用using 构造。【参考方案7】:

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

【讨论】:

我不知道“安全”。 “有意义”会更合适。首先将为Dictionary某事,你只是不知道那是什么,不像有序字典,在这种情况下First 有一个有意义的值。 +1,但只是一个想法:对性能不利,因为 OrderedDictionary 是非泛型的,这意味着必须进行装箱/拆箱。【参考方案8】:

编辑: 使用 OrderedDictionary。

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

例如:

var firstElement = like.FirstOrDefault();
string firstElementKey = firstElement.Key;
Dictinary<string,string> firstElementValue = firstElement.Value;

【讨论】:

FirstOrDefault() 的优点是,如果字典中不存在,它会给出一个默认值。 然而,由于字典是无序的,所以字典中一开始就没有“第一个”项这样的东西。不存在这样的项目。您可以从字典中获取一个项,但您需要有一个有序的数据结构才能获取“第一个”。 我同意。拥有orderedDictionary 对“First”有意义。【参考方案9】:

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

【讨论】:

以上是关于从字典中获取第一个元素的主要内容,如果未能解决你的问题,请参考以下文章

在提到的网址中,我只需要从网址中获取第一本字典吗?

如何获取 NSDictionary 中的第一个元素?

Day2 列表,元组,集合,字典

python字典转换为list后选中最后一个值

Python面试必考重点之列表,元组和字典第十四关——如何使用分片获取产生器类型对象中的部分元素呢

从过滤聚合pySpark中获取第一个示例元素