我有一个带有节点和边缘的加权图。
每个节点都包含一个名为edges的LinkedList,用于存储此节点的边缘。每个边都有一个权重和一个节点(另一端的节点)。
我已经这样做了:
static void removeEdge(Node n1, Node n2)
{
n1.edges.Remove(n1.edges.First(a => a.node == n2));
n2.edges.Remove(n2.edges.First(a => a.node == n1));
}
我正在尝试使用updateEdge方法,该方法将采用相同的lambda表达式然后执行此操作:
(a => a.node == n2).weight = otherValue;
但是我收到了一个错误。这不允许吗?或者我做错了什么?从我测试过的lambda表达式来看,除了删除元素之外似乎没问题,虽然我是新手,所以我很丢失了。
答案 0 :(得分:3)
我认为你误解了lambda是什么。当你说像
这样的话...First(x => x.bar == 10)
我们生成的是这样的事情:
static bool M(X x) { return x.bar == 10; }
...
... First(new Func<X, bool>( M ) )
也就是说,我们从lambda中创建一个方法,然后从该方法中创建一个委托,然后传递该委托。
做类似
的事情(x=>x.bar==10).foo = whatever
在道德上与做像M.foo =无论什么一样,M是一种方法。方法没有属性,因此这始终是非法的。同样,lambdas也没有属性。 lambda只是方法的一种方便的语法。
答案 1 :(得分:0)
Oooooooh!
我只需要这样做:
n1.edges.First(a => a.node == n2).weight = otherValue;
n2.edges.First(a => a.node == n1).weight = otherValue;