我有一段使用LINQ过滤列表的代码,创建了一个匿名类型实例的列表,并为每个实例分配了一个事件处理程序:
// Select every linear expression and create a menu item from it
var items = from expr in expressionList.Expressions
where expr.Type == ExpressionType.Linear
let stdExpr = (StandardExpression)expr
select new
{
Menu = new ToolStripMenuItem(stdExpr.Expression), // string
stdExpr.Slot // int
};
// Wire a Click event handler to each menu to set the tracked line
foreach (var item in items)
{
item.Menu.Click += (s, e) => graph.SetTrackedLine(item.Slot);
menuTrackLineWithMouse.DropDownItems.Add(item.Menu);
}
这种方法在事件处理程序的连接和菜单的正确添加方面表现良好。问题出在当菜单项被点击并且处理程序被触发时。无论哪个菜单项触发了处理程序,只有最后一个被传递到
SetTrackedLine
。例如,如果我有两个菜单,"sin(x)",槽位为
0
,和"cos(x)",槽位为1
,则无论是点击"sin(x)"还是"cos(x)",所有Click
事件都会将1
传递给SetTrackedLine
。我的问题是,为什么会这样?
item.Slot
不应该指向匿名类型的每个独立实例吗?谢谢。