2016-10-12 2 views
0

Я хочу обновить значение узла в связанном списке с помощью linq. Перемещение списка, поиск нужного узла и обновление значения работают, но я думаю, что метод linq может быть более чистым.Как обновить значение узла в связанном списке с помощью linq

Это моя попытка, которая дает ошибку компиляции cannot convert lambda expression to type <Main.Globals.Node> because it is not a delegate type:

// get IV value where Node BookID=4 
var val = Globals.BookLL.Where(B => B.BookID == 4).Select(B => B.IV).Single(); 

// can update first node using this method 
Globals.BookLL.First.Value.IV = 999; 

// can upddate IV by traversing list 
LinkedListNode<Globals.Node> Current = Globals.BookLL.First; 
while (Current != null) 
      { 
       if(Current.Value.BookID==4) 
       { 
        Current.Value.IV = 444; 
       } 
       Current = Current.Next; 
      } 

    // how can you update IV using linq? 
    Globals.BookLL.Find(B => B.BookID == 4).Value.IV = 999;  // cannot convert lambda expression to type <Main.Globals.Node> because it is not a delegate type 

Спасибо за любую помощь.

+0

Если это метод Linq, ou должен вызывать 'First':' Globals.BookLL.First() ' –

ответ

2
Globals.BookLL.Single(b => b.BookId == 4).IV = 44; 

Вы можете использовать single если BookIds уникальны.

+0

Спасибо это работает. – Zeus

+0

Могу ли я использовать тот же метод для вложенного списка? Я получаю сообщение об ошибке: '' var K = Globals.BookLL.Single (B => B.BookID == 4); var G = K.GreeksLL.Single (G => G.BookOrComp == "Book" && G.GreekType == "Delta"); локальное или имя параметра G не может быть объявлено в этой области ... '' – Zeus

+0

нашел ошибку! Еще раз спасибо за помощь – Zeus

0
Globals.BookLL.Find(B => B.BookID == 4) 

Это возвращает IEnumerable<Globals.Node>, вы должны использовать LINQ-х First():

Globals.BookLL.First(B => B.BookID == 4).Value.IV = 999; 
+0

' First() 'возвращает' BookLL', у которого нет свойства 'Value' – fubo

+0

Спасибо, но я думаю fubo прав. Я получаю ошибку компиляции на '' IV'', говоря, что '' double не содержит определения для IV и никакого метода расширения IV, принимающего .... '' – Zeus

+0

Спасибо всем, я очень ценю вашу помощь. – Zeus

2

Если вы используете

Globals.BookLL val = Globals.BookLL.Single(B => B.BookID == 4); 

для определения элемента, вы можете использовать Find()

Globals.BookLL.Find(val).Value.IV = 999; 

изменить это значение

+0

Я получаю ошибку компиляции в первом '' BookLL - не удалось найти тип или пространство имен ... '' – Zeus

+0

@Zeus заменил 'BookLL' на' Globals.BookLL' – fubo

+0

Спасибо за вашу помощь, теперь его работа – Zeus

Смежные вопросы