如何在不知道键的情况下循环遍历C#字典(Dictionary<string, string>)中的项

10

我有一个:

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

4
你希望第一个项目是什么? - Gabe
1
为什么要使用字典呢?数组或列表不能胜任这项工作吗? - Lee Willis
你能解释一下如果你不知道如何循环遍历一个字典或者如果你无法在不知道键值的情况下引用字典中的特定条目,该怎么办吗? - Steve
7个回答

9
我如何在不知道键的情况下循环遍历项目?
例如,我想获取item[0]的值。
你想把字典当作(有序的)集合类似于列表或数组,并在其中获取第一个项目吗?
你可以这样做,因为Dictionary<string, string>隐式地实现了IEnumerable<KeyValuePair<string, string>>。只需使用FirstFirstOrDefault:
string valueAtFirstPosition = selectedDates.First().Value; 

请注意,字典不是用作有序集合的。它是一种可以通过键快速查找值的集合。但您仍然可以枚举它。

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

您不应仅仅依赖于那个排序。我认为在当前实现中,只要不删除任何项,顺序是稳定的。 阅读

阅读:为什么字典“无序”?


谁点赞了这个?“如何循环遍历项目”,你说“使用first”?这个答案是错误的。 - Dbl
@TimeSchmelter的问题要求另外一件事情。使用[0]是OP表达他不知道如何使用字典,并拒绝阅读msdn api的方式。 - Dbl
他正在添加字符串键,并期望索引器与整数一起使用。不,如果您使用的是字典,那不是您想要的。如果他想要第一个项目,他希望使用列表。 - Dbl
@AndreasMüller:他并不指望它能够正常工作,他只是想在需要访问第一个元素时像使用列表一样使用它。这就是为什么我提到字典不应该被用作有序集合的原因。然而,只要您稍后不修改字典(确切地说:删除项目),顺序就是稳定的。 - Tim Schmelter
好的。在这种情况下,您可能已经正确猜到了他的意图,他只是不知道要使用哪个集合。 - Dbl
显示剩余2条评论

3

尝试这个

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

6
虽然这是一种有趣的做法,但使用 foreach(var v in sselectedDates){ var date = v.Value;} 是否更好呢? - Vincent

2

这很简单,用一个foreach循环它或者要获取特定索引则做如下操作:

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

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 中的 Dictionary 是哈希表数据结构的一种实现(树映射是另一种映射实现)。(译者注:链接未翻译)

1

try this :

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

1
正如Vincent在nsgocev的回答中所评论的:“foreach(var v in sselectedDates){ var date = v.Value;}”会更好吧? - user2819245

0
使用Where的这个重载:
var result = selectedDates.Where((d,i)=>i==0);

0

尝试:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接