【问题标题】:c# Dictionary<string,string> how to loop through items without knowing key [duplicate]c#Dictionary<string,string>如何在不知道键的情况下遍历项目[重复]
【发布时间】:2014-09-19 18:08:43
【问题描述】:

我有一个:

var selectedDates = new Dictionary<string, string>();
selectedDates.Add("2014-06-21", DateTime.Now.ToLongDateString());
selectedDates.Add("2014-07-21", DateTime.Now.AddDays(5).ToLongDateString());
selectedDates.Add("2014-08-21", DateTime.Now.AddDays(9).ToLongDateString());
selectedDates.Add("2014-09-21", DateTime.Now.AddDays(14).ToLongDateString());

如何在不知道密钥的情况下循环遍历项目?

例如我想获取 item[0]

的值

如果我这样做:

var item = selectedDates[0].value; // I get an error

【问题讨论】:

  • 你希望第一个项目是什么?
  • 那为什么要使用字典呢?数组或列表不能完成这项工作吗?
  • 如果您不知道如何遍历字典,或者您在不知道键值的情况下引用字典中的特定条目时遇到问题,能否解释一下?

标签: c# idictionary


【解决方案1】:

如何在不知道密钥的情况下循环遍历项目?

例如我想获取item[0]的值

您希望将字典视为类似于列表或数组的(有序)集合并获取其中的第一项?

您可以,因为 Dictionary&lt;string, string&gt; 隐含地是 IEnumerable&lt;KeyValuePair&lt;string, string&gt;&gt;。只需使用FirstFirstOrDefault

string valueAtFirstPosition = selectedDates.First().Value; 

但是,请注意字典并不意味着用作有序集合。它是一个集合,可用于通过键快速查找值。但无论如何你都可以枚举它。

foreach(KeyValuePair<string, string>keyVal in selectedDates)
{
    Console.WriteLine("Key: {0} Value: {1}", keyVal.Key, keyVal.Value);
}

您根本不应该依赖该顺序。我认为在当前的实现中,只要您不删除项目,订单就是稳定的。 Read

阅读:Why is a Dictionary “not ordered”?

【讨论】:

  • 谁赞成这个? “如何遍历项目”,你说“先使用”?这个答案是错误的
  • @AndreasMüller:我将“item[0]”理解为“给我第一个项目”,将“循环槽项目”理解为“将其用作收藏”。
  • @TimeSchmelter 问题要求其他内容。 using [0] 是OP表达他不知道如何使用字典并且拒绝阅读msdn api的方式
  • @AndreasMüller:你怎么知道? OP 试图找到 0(int) 作为关键,即使他添加了DateTimes(如string)?他想要第一个不是更不可能吗?
  • 他正在添加字符串键并希望索引器使用整数。不,如果您使用的字典不是您想要的。如果他想要第一个项目,他希望会使用列表来代替
【解决方案2】:

让我为你整理两件事。首先,您可以循环或使用 LINQ 访问元素,就像在列表中一样:

var dict = new Dictionary<string, string>();

// loop
foreach (var item in dict)
{
    var key = item.Key;
    var value = item.Value;
}

// "first" (see below)
var firstItem = dict.First();

但是,请注意,您所指的第一项几乎可以是Dictionary 中的任何项目。字典以任何便于查找的顺序存储元素(集合也是如此)。

这种顺序在某些实现中是已知的,但当元素的顺序很重要时,列表或数组可能更适合。 .NET 中的 Dictionaryhash table data structure 的实现(树形图是另一种映射实现)。

【讨论】:

    【解决方案3】:

    很简单,使用foreach 循环遍历它或获取特定索引:

    var date = selectedDates.ElementAt(0).Value;
    

    【讨论】:

      【解决方案4】:

      试试这个

        foreach (string key in selectedDates.Keys)
        {
              var item = selectedDates[key]; 
        }
      

      【讨论】:

      • 虽然这是一种有趣的方法,但是 foreach(var v in sselectedDates){ var date = v.Value;} 不是更好吗?
      【解决方案5】:

      试试这个:

      foreach(var key in selectedDates.Keys)
      {
          var value = selectedDates[key];
      }
      

      【讨论】:

      • 正如文森特已经在 nsgocev 的回答中评论的那样:“foreach(var v in sselectedDates){ var date = v.Value;} 会不会更好?”跨度>
      【解决方案6】:

      试试:

      foreach (var date in selectedDates)                
      {                  
          var item = date.Value;              
      }
      

      【讨论】:

        【解决方案7】:

        使用Where的这个重载:

        var result = selectedDates.Where((d,i)=>i==0);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-07-19
          • 2012-06-16
          • 2020-02-02
          • 1970-01-01
          • 2015-03-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多