Как обновить значение узла в linkedlist с помощью linq

#c# #linq #linked-list #find

#c# #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
  

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

Комментарии:

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

Ответ №1:

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

Вы можете использовать single , если идентификаторы книг уникальны.

Комментарии:

1. Могу ли я использовать тот же метод для вложенного связанного списка? Я получаю сообщение об ошибке с этим: var K = Globals.BookLL.Single(B => B.BookID == 4); var G=K.GreeksLL.Single(G => G.BookOrComp == "Book" amp;amp; G.GreekType == "Delta"); a local or parameter name G cannot be declared in this scope...

Ответ №2:

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

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

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

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

чтобы изменить его значение

Комментарии:

1. Я получаю ошибку компиляции при первом BookLL - the type or namespace could not be found...

2. @Zeus заменен BookLL на Globals.BookLL

Ответ №3:

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

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

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

Комментарии:

1. First() возвращает BookLL значение, которое не имеет Value свойства

2. Спасибо, но я думаю, что фубо прав. Я получаю ошибку компиляции IV , говоря, что double does not contain a definition for IV and no extension method IV accepting ....