我创建了一个这样的字典:
var sortedDict = new Dictionary<DateTime, List<double>>();
我现在在任何特定的日期时间键都有多个值(列表)。
如果我需要在任何DATETIME键访问特定值,我该如何获取它?
感谢您的帮助。
答案 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
类型的对象。在您的情况下,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();
答案 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 J和Matt 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。