Общий вопрос о синтаксисе лямбда-кода

#c# #.net #c#-4.0 #syntax #lambda

#c# #.net #c #-4.0 #синтаксис #лямбда

Вопрос:

Итак, я, кажется, уверен, что следующие 2 утверждения одинаковы

 List<object> values = new List<object>();
values.ForEach(value => System.Diagnostics.Debug.WriteLine(value.ToString()));
  

И

 List<object> values = new List<object>();
values.ForEach((object value) => { 
    System.Diagnostics.Debug.WriteLine(value.ToString());
});
  

И я знаю, что могу вставить несколько строк кода во втором примере, например

 List<object> values = new List<object>();
values.ForEach((object value) => { 
    System.Diagnostics.Debug.WriteLine(value.ToString());
    System.Diagnostics.Debug.WriteLine("Some other action");
});
  

Но можете ли вы сделать то же самое в первом примере? Кажется, я не могу придумать способ.

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

1. Если в C # был оператор запятой, как в C или C , то это можно было бы использовать, чтобы избежать скобок. Однако в C # нет оператора запятой (за исключением исключения в циклах for). Но в C # нет этого оператора, поэтому он несколько неуместен.

Ответ №1:

Да, вы можете 🙂

         List<object> values = new List<object>();
        values.ForEach(value =>
                           {
                               System.Diagnostics.Debug.WriteLine(value.ToString());
                               System.Diagnostics.Debug.WriteLine("Some other action");
                           }

            );
  

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

1. также с типизированными свойствами, BlahObj. ForEach(значение => { Debug. Строка записи (значение. BlahProperty); });

Ответ №2:

Это работает нормально:

 values.ForEach(value =>
        { System.Diagnostics.Debug.WriteLine(value.ToString()); }
);
  

Возможно, вы забыли ;

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

1. 1: Я также полагал, что OP забыл бы ; . Лолз в @o6tech, который, по-видимому, не слишком хорошо читает вопросы

2. … по-видимому, я этого не делаю. 1 вам 🙂

3. Что ж, прочитав еще раз, я все еще думаю, что мой комментарий был верен. Его первый пример (к которому он хотел добавить несколько операторов) не включал {}’s , так что, возможно, он их опускал, нет?

Ответ №3:

Единственное реальное различие между первым и вторым — это { } . Добавьте это к первому, и вы сможете добавить столько строк, сколько захотите. Это не (значение объекта), которое позволяет вам добавлять несколько строк.

Ответ №4:

Как показали другие, для этого можно использовать оператор lambda (с фигурными скобками):

 parameter-list => { statements; }
  

Однако стоит отметить, что это имеет ограничение: вы не можете преобразовать лямбда-выражение в дерево выражений, только делегат. Так, например, это работает:

 Func<int> x = () => { return 5; };
  

Но это не:

 Expression<Func<int>> y = () => { return 5; };