2010-02-07 3 views
1

У меня есть взвешенный граф с его узлами и краями.Доступ к полю класса после выражения лямбда

Каждый узел содержит 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, что бы тот же лямбда-выражения, а затем сделать это:

(a => a.node == n2).weight = otherValue; 

, но я получаю сообщение об ошибке , Разве это не разрешено? Или я делаю что-то неправильно? Из того, что я тестировал, выражение лямбда кажется вполне удачным, поскольку удаляет элементы, хотя я новичок в этом, поэтому я довольно потерял tbh.

ответ

3

Я думаю, вы непонимание, что такое лямбда. Когда вы говорите что-то вроде

...First(x => x.bar == 10) 

что происходит, мы создаем что-то вроде этого:

static bool M(X x) { return x.bar == 10; } 
... 
... First(new Func<X, bool>(M)) 

То есть, мы делаем метод из лямбда, а затем сделать делегат из метода, а затем передать делегата.

Делать что-то вроде

(x=>x.bar==10).foo = whatever 

морально так же, как делать что-то вроде M.foo = угодно, где М представляет собой метод. Методы не имеют свойств, поэтому это всегда незаконно. Точно так же у лямбда тоже нет свойств. Лямбда - просто удобный синтаксис для метода.

0

Oooooooh!

мне просто нужно, чтобы сделать это:

n1.edges.First(a => a.node == n2).weight = otherValue; 
n2.edges.First(a => a.node == n1).weight = otherValue; 
Смежные вопросы