Как сделать C# 'grep' Более функциональным использованием LINQ?

Преимущества super() в единичном наследовании минимальны - главным образом, у Вас нет к твердому коду названия базового класса в каждый метод, который использует его родительские методы.

Однако почти невозможно использовать множественное наследование без super(). Это включает общие идиомы как mixins, интерфейсы, абстрактные классы, и т.д. Это расширяется на код, который позже расширяет Ваш. Если бы кто-то позже хотел записать класс, который расширился Child и смешивание, их код не работал бы правильно.

9
задан Jonathan Mitchem 13 July 2009 в 21:09
поделиться

2 ответа

Как насчет:

var matches =
    from fileName in filesToLookIn
    from line in File.ReadAllLines(fileName)
    from searchString in searchStrings
    where line.Contains(searchString)
    select new
    {
        FileName = fileName,
        SearchString = searchString
    };

    foreach(var match in matches)
    {
        references.AddIfNew(match.SearchString, match.FileName);
    }

Изменить:

По сути, запрос превращает каждое имя файла в набор строк, а затем перекрестно объединяет этот набор строк с набором строк поиска ( означает, что каждая строка соединена с каждой строкой поиска). Этот набор фильтруется до совпадающих строк, и для каждой строки выбирается соответствующая информация.

Множественные предложения из аналогичны вложенным операторам foreach . Каждый указывает на новую итерацию в рамках предыдущей. Несколько предложений from преобразуются в метод SelectMany , который выбирает последовательность из каждого элемента и объединяет результирующие последовательности в одну последовательность.

Весь синтаксис запросов C # транслируется в методы расширения. Однако компилятор использует некоторые уловки. Один из них - использование анонимных типов. Когда 2+ переменных диапазона находятся в одной области видимости, они, вероятно, являются частью анонимного типа за кулисами. Это позволяет произвольному количеству данных с заданной областью проходить через методы расширения, такие как Select и Where , которые имеют фиксированное количество аргументов. См. этот пост для получения дополнительной информации.

Вот перевод метода расширения вышеуказанного запроса:

var matches = filesToLookIn
    .SelectMany(
        fileName => File.ReadAllLines(fileName),
        (fileName, line) => new { fileName, line })
    .SelectMany(
        anon1 => searchStrings,
        (anon1, searchString) => new { anon1, searchString })
    .Where(anon2 => anon2.anon1.line.Contains(anon2.searchString))
    .Select(anon2 => new
    {
        FileName = anon2.anon1.fileName,
        SearchString = anon2.searchString
    });
9
ответ дан 4 December 2019 в 19:35
поделиться

Я обычно не люблю публиковать ссылки на Википедию, но вот ссылка на очень хорошее объяснение в Википедии ...

Вот и вся суть :

  • У Алисы есть счет в банке http: // unsafe / . К сожалению, Алиса не очень разбирается в вопросах безопасности.

  • Мэллори пытается получить деньги Алисы из банка.

  • Алиса имеет разумный уровень доверия к Мэллори и будет посещать ссылки, которые Мэллори отправляет ей.

    1. Мэллори определила что http: // unsafe / принимает любой идентификатор сеанса, принимает идентификаторы сеанса из строк запроса и не имеет проверки безопасности. http: // unsafe / , таким образом, небезопасен.
    2. Мэллори отправляет Алисе электронное письмо: «Эй, проверьте это, в нашем банке есть классная новая функция сводки счетов, http:
3
ответ дан 4 December 2019 в 19:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: