c#Dictionary<string,string>如何在不知道键的情况下遍历项目[重复]

Posted

技术标签:

【中文标题】c#Dictionary<string,string>如何在不知道键的情况下遍历项目[重复]【英文标题】:c# Dictionary<string,string> how to loop through items without knowing key [duplicate] 【发布时间】: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

【问题讨论】:

你希望第一个项目是什么? 那为什么要使用字典呢?数组或列表不能完成这项工作吗? 如果您不知道如何遍历字典,或者您在不知道键值的情况下引用字典中的特定条目时遇到问题,能否解释一下? 【参考方案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);

【讨论】:

以上是关于c#Dictionary<string,string>如何在不知道键的情况下遍历项目[重复]的主要内容,如果未能解决你的问题,请参考以下文章

524 Longest Word in Dictionary through Deleting

泛型之Dictionary

ConcurrentDictionary和Dictionary对比

连接两个字典[重复]

c#Dictionary<string,string>如何在不知道键的情况下遍历项目[重复]

转<<C#集合Dictionary中按值的降序排列