【问题标题】: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):stackoverflow.com/q/436954/1001985
  • 当您知道字典中只有一个项目时,使用 First() 是有意义的,因为您已经对字典进行了 .Count。然后你不需要对一个项目做一个 foreach 循环,只需使用 First()
  • @LouiseEggleton 这正是我使用此解决方案的方式。感谢您对 OP 的问题保持冷静。

标签: c# asp.net .net .net-3.5


【解决方案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 属性来选择一个。

      【讨论】:

        猜你喜欢
        • 2023-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-24
        • 2018-12-31
        • 1970-01-01
        • 2012-02-11
        • 1970-01-01
        相关资源
        最近更新 更多