Помогите разобратсья с lambda

208
14 марта 2018, 03:32

Есть такой код:

private static Row GetRow( Worksheet worksheet, uint rowIndex )
{
         return worksheet.GetFirstChild<SheetData>().
                     Elements<Row>().Where( r => r.RowIndex == rowIndex ).First();
}

Что бы мне его лучше понять я его раскладываю так:

SheetData sheetData = worksheet.GetFirstChild<SheetData>();
Row row = sheetData.Elements<Row>().Where( r => r.RowIndex == rowIndex ).First();

Но кто мне подскажет как я могу написать выражение:

...Where( r => r.RowIndex == rowIndex ).First();

Без лямбды? Это вообще возможно, ведь раньше как то это делали? Я не против лямбд, просто хочу разобраться.

Answer 1

Когда-то давно, во времена C# 1.0, использовали обычные делегаты. Без поддержки замыканий на уровне языка было тяжело, и приходилось писать что-то вроде:

class RowIndexFilter
{
    public RowIndexFilter(rowIndex)
    {
        this.RowIndex = rowIndex;
    }
    int RowIndex;
    public bool Filter(Row r)
    {
        return r.RowIndex == this.RowIndex;
    }
}
// объявлен где-то рядом с Where
delegate bool RowFilter(Row r);
// 
....Where(new RowFilter(
             new RowIndexFilter(rowIndex).Filter
                       )
          ).First();

C# 2.0 принес с собой вывод типа делегата. Теперь код окончательного вызова чуть сократился

// 
....Where(new RowIndexFilter(rowIndex).Filter).First();

Но кроме того, C# 2.0 принес с собой анонимные методы и механизм замыканий. Компилятор научился генерировать классы-обертки сам, весь код стал выглядеть вот так:

...Where(delegate(Row r) { return r.RowIndex == rowIndex; } ).First();

Этот синтаксис появился в 2005-ом году.

Лямбды, добавленные в C# 3.0, не сильно его сократили. Основная фишка лямбд - это возможность компилировать их как в анонимные методы, так и в деревья выражений. А вовсе не для экономии на слове delegate :)

Answer 2

Пока писал сам понял сори за тупняк:

    Row row;
    foreach(Row currow in sheetData.Elements<Row>() )
    {
        if( currow.RowIndex == rowIndex )
        {
            row = currow;
            break;
        }
    }
READ ALSO
C# WPF. Перенос текста на другие строчки в ячейке таблицы

C# WPF. Перенос текста на другие строчки в ячейке таблицы

ЗдравствуйтеЕсть такая ссылка по моему вопросу: ссылка (свойство ElementStyle)

186
Как изучать последовательно Javascript? [дубликат]

Как изучать последовательно Javascript? [дубликат]

На данный вопрос уже ответили:

237
Сортировка подмассивов в массиве [дубликат]

Сортировка подмассивов в массиве [дубликат]

На данный вопрос уже ответили:

237
Owl-carousel. Проблема с width при обновлении страницы

Owl-carousel. Проблема с width при обновлении страницы

Столкнулся с проблемойНа ПК версии сайта (Широкий экран) при загрузке страницы карусель отображается нормально

180