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

时间:2015-07-17 18:06:01

标签: c# dictionary

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

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

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

如果我需要在任何DATETIME键访问特定值,我该如何获取它?

感谢您的帮助。

5 个答案:

答案 0 :(得分:3)

我建议使用utcNow和索引i的密钥,如下所示的方法:

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

这将避免在字典上进行双索引查找,并清楚地传达意图(此值可能会或可能不会在那里)

答案 1 :(得分:2)

根据您的密钥date和索引i,这很简单:

var value = sortedDict[date][i];

这假设密钥存在于字典中。如果有可能没有,那么你应该先检查。

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

当您使用Dictionary<S,T>类型的密钥访问S时,您获得的是T类型的对象。在您的情况下,TList<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();

答案 2 :(得分:2)

var utcNow = DateTime.UtcNow; //example DateTime
if (sortedDict.ContainsKey(utcNow))
{
    foreach (double listItem in sortedDict[utcNow])
    {
        //manipulate listItem here
    }
}

编辑:看起来我误解了这个问题;我认为您想要遍历List<Double>中特定DateTime密钥的sortedDict值。诸如Eric JMatt Burland之类的解决方案是更好的方法。

答案 3 :(得分:2)

字典查找通常便宜,而对于DateTime键,它们是,但MSDN指出The speed of retrieval depends on the quality of the hashing algorithm of the type specified for 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
}

答案 4 :(得分:2)

要从列表中获取特定值,请使用List.Find()。 要获取特定值的列表INDEX,请使用List.FindIndex()。 有关所有列表成员的列表,请参阅https://msdn.microsoft.com/en-us/library/6sh2ey19%28v=vs.110%29.aspx