2014-12-03 47 views
1

如何获得在所选择的(的foreach)先前元件一些这样dic[index -1].Key字典LINQ选择先前

new Dictionary<int, double>(); 

dic.Select(x => x.Value*(x.Equals(dic.FirstOrDefault()) ? x.Key : //x.Key - dic[index -1].Key//)).Sum() 
+2

字典无序。 'FirstOrDefault()'在这里无法正常工作。 – SLaks 2014-12-03 15:25:30

+0

你能扩展你的答案并告诉我们为什么你需要这样做吗?它会帮助我们帮你 – 2014-12-03 15:25:35

+0

字典没有订单。如果你使用了'OrderedDictionary',那么'foreach'可能会更清洁,因为你需要跟踪“最后一个”键。 – 2014-12-03 15:26:04

回答

3

Select方法提供了一个索引作为第二参数。

dic.Select((x, index) => dict[index]) 

如果你想选择一个索引的元素,你可以使用ElementAt

dic.Select((x, index) => dic.ElementAt(index).Key) 
+1

以及如何你会用这个问题吗? 'dict [index]'不会选择“第n个”项;它会返回'index'是关键字的值。 – 2014-12-03 15:28:05

+0

但是如何访问密钥,因为字典[索引]。(仅限数值) - 我的字典包含例如:23,10.00; 150,56.7;我需要得到确切的关键 – AleksP 2014-12-03 15:34:14

+0

@AleksP我已经更新了答案。事实上,我认为只需要一个普通的'for'循环就可以轻松完成。 – 2014-12-03 15:36:35

0

如果使用OrderedDictionary那么它可能会更快地使用直foreach

double sum = 0.0; 
int prev = 0; 
foreach(var kvp in dic) 
{ 
    sum += kvp.Value * (kvp.Key - prev); 
    prev = kvp.Key; 
} 

在任何情况下,我会首先想出工作然后重新构成如果你能使它更好更好。 “更好”可能不会使用Linq;在大多数情况下,难以理解和调试的令人费解的Linq查询比干净,高效的循环更糟糕。