如何在字典中的特定键处访问列表中的特定索引

本文关键字:访问 列表 索引 字典 | 更新日期: 2023-09-27 18:03:11

我创建了一个这样的字典:

var sortedDict = new Dictionary<DateTime, List<double>>();

我现在在任何特定的日期时间键上都有多个值(列表(。

如果我需要访问任何DATETIME键上的特定值,我该如何访问它?

谢谢你的帮助。

如何在字典中的特定键处访问列表中的特定索引

我建议使用如下方法,给定utcNow的键和索引i:

List<double> vals;
if(sortedDict.TryGetValue(utcNow, out vals)) {
  double val = vals[i];
}

这将避免在字典上进行双索引查找,并清楚地传达意图(该值可能存在,也可能不存在(

字典查找通常很便宜,对于DateTime键来说也很便宜,但MSDN指出,检索速度取决于为TKey指定类型的哈希算法的质量。还要注意的是,查找方法O(1(,但对于经常访问的大型字典,方法可能只需要避免双重查找。

因此,为了完整性:

int i = 42; // Or whatever index you want to look up
DateTime date = DATE_YOU_WANT_HERE;
List<double> valuesForDate;
bool foundDate = sortedDict.TryGetValue(date, out valuesForDate);
if (foundDate)
{
    double theValue = valuesForDate[i];
}
else
{
    // Whatever you need to do if there is no key for your date
}

给定密钥datei的索引,这很简单:

var value = sortedDict[date][i];

这是假设该关键字存在于字典中。如果有可能没有,那么你应该先检查一下。

if (sortDict.ContainsKey(date)) 
{
    var value = sortedDict[date][i];
}

当您使用类型为S的密钥访问Dictionary<S,T>时,您得到的是类型为T的对象。在您的情况下,T就是List<double>

如果你想提取字典中所有键的索引i(因为重读这个问题,我不确定这不是你想要的(,那么这很简单:

var allI = sortedDict.Select(k => k.Value[i]).ToList();

但这假设i存在于所有键值中。如果没有,你也需要检查一下:

var allI = sortedDict.Where(k => i < k.Value.Length ).Select(k => k.Value[i]).ToList();
要从列表中获取特定的VALUE,请使用list.Find((。要获取特定值的列表INDEX,请使用list.FindIndex((。看见https://msdn.microsoft.com/en-us/library/6sh2ey19%28v=vs.110%29.aspx以获取所有列表成员的列表。
var utcNow = DateTime.UtcNow; //example DateTime
if (sortedDict.ContainsKey(utcNow))
{
    foreach (double listItem in sortedDict[utcNow])
    {
        //manipulate listItem here
    }
}

编辑:看起来我误解了这个问题;我认为您想要迭代sortedDict中特定DateTime键的List<Double>的值。Eric J和Matt Burland的解决方案是更好的解决方案。