2013-11-02 196 views
1

我想从微软网站上学习lambda表达式,我试图将它应用到我创建的场景中以更深入地了解该网站试图展示的内容。我偶然发现了与linq和lambda关联的聚合函数。请告诉我正在尝试实现什么是正确的语法。基本上,我有一个称为物品的类,它有3个属性:类别,ID和重量。一个类别可以有多个与之关联的ID,我正在考虑获得类别的总权重,该类别是每个具有我指定类别的ID的所有单个权重的总和。 更具体地说,这是我的结构的提取物:带聚合函数的lambda表达式

class item 
    { 
     public int NodeID 
     { get; set; } 
     public int Weight 
     { get; set; } 
     public int Category 
     { get; set; } 
    } 

我有以下的解释:

Dictionary<int,item> _itemsReceivedList=new Dictionary<int,item>(); 

而这正是我试图让C类的总重量:

_itemsReceivedList.Select(x=>x.Value.Category==c) 
.Sum(what should I put here for the predicate?) 

我想总结每个具有类别c的项目的权重。 请指教。谢谢!

+2

['Select'(HTTP:// MSDN。 microsoft.com/en-us/library/bb548891%28v=vs.110%29.aspx)不会过滤。它将这些元素投射到别的东西上。在这里你将元素投影到布尔中。使用['Where'](http://msdn.microsoft.com/zh-cn/library/bb534803%28v=vs.110%29.aspx)进行过滤。 – pescolino

回答

3
var sum = _itemsReceivedList 
      .Where(x=>x.Value.Category==c) 
      .Sum(x=>x.Value.Weight); 
+0

谢谢大家闪电般的快速回应。我试过这个,但这是我得到的错误:错误'bool'没有包含'Weight'的定义,也没有扩展方法'Weight'接受类型'bool'的第一个参数你是否缺少using指令或程序集引用?) – user1205746

+0

上一条语句中的'x'仍然是一个KeyValuePair。 – Sam

+0

@ user1205746我更新了答案。 –

2

写这

_itemsReceivedList.Where(x=>x.Value.Category==c).Sum(x => x.Weight); 
+1

这是错误的:带有布尔表达式的'Select'返回'IEnumerable '。 – pescolino

+0

这是很常见的错误。你很困惑.Select()与.Where() –

3
int weight = _itemsReceivedList.Where(x => x.Value.Category == c) 
           .Select(s => s.Value) 
           .Sum(item => item.Weight); 

我认为c声明别的地方为int

ScreenPrint

+0

是的,山姆。 c是整数,但我得到这个:错误'布尔'不包含'重量'的定义和没有扩展方法'重量'接受类型'布尔'的第一个参数可以找到(你是否缺少using指令或者一个程序集引用?) – user1205746

+1

这工作时,我只是测试它..我会上传一个截图 – Sam