在lambda表达式之后访问类的字段

时间:2010-02-07 05:48:50

标签: c# linq

我有一个带有节点和边缘的加权图。

每个节点都包含一个名为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表达式来看,除了删除元素之外似乎没问题,虽然我是新手,所以我很丢失了。

2 个答案:

答案 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;