从字典中获取第一个元素
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<TKey,TValue>
实现。但是对于字典来说,“第一”没有明确的含义。根据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<string, Dictionary<string,string>>
。
还请注意,您可以通过将 First
与 Linq OrderBy
结合使用来获得特定含义:
var first = like.OrderBy(kvp => kvp.Key).First();
【讨论】:
我建议进行编辑以将val
更改为正确的值(因为它是一个字符串),但我猜它被拒绝了?
@Eve - 是的,因为 val 是 Dictionary<string, string>
,而 like
是 Dictionary<string, Dictionary<string, string>>
。
哦,对不起,打扰了。
@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<string, string>
,其中键和值都是 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】:
字典没有定义项目的顺序。如果您只需要一个项目,请使用字典的Keys
或Values
属性来选择一个。
【讨论】:
以上是关于从字典中获取第一个元素的主要内容,如果未能解决你的问题,请参考以下文章