Если у вас есть C # 3, вам не нужно писать специальный класс для этого.Предположим, у вас есть последовательность строк, такая как List<string>
или string[]
, что-либо, поддерживающее IEnumerable<string>
, называемое filePathCollection
, вы можете просто использовать:
var prefixedPaths = filePathCollection.Select(path => baseDirectory + path);
Привет, теперь выиметь IEnumerable<string>
путей с префиксом baseDirectory
, так что вы можете использовать foreach
на нем и т. д. Мы закончили.
Остальная часть этого ответа - более общее объяснение, чтобы помочьВы (и другие) замечаете, где это может быть применено в других случаях.
Select
по существу означает: взять эту последовательность предметов, сделать что-то с каждым предметом и вернуть мне новую последовательность, содержащую все результаты.«Что-то» задается путем предоставления метода, который принимает один параметр того же типа, который хранится в старой последовательности, и возвращает любой тип, который вам нравится, который будет типом элемента новой последовательности.В этом случае мы не меняем тип элемента.Также мы определяем метод «на месте», используя лямбду:
path => baseDirectory + path
Компилятор выясняет, что тип элемента исходной коллекции равен string
, поэтому path
представляет собой string
- вы можете думать, что path
играет ту же роль, что и «переменная цикла», если вы должны были написать все сами.И в path
мы используем конкатенацию, поэтому в результате получается еще один string
, поэтому новая последовательность также должна быть IEnumerable<string>
.Это «вывод типа» и важная часть того, как этот материал уменьшает объем кода, который вы должны написать.
Другая важная вещь - это «замыкание», которое является техническим названием того, как мы делаемнаша лямбда зависит не только от ее «открытого» параметра path
, но также и от «закрытого» параметра baseDirectory
, который даже не передается явно в качестве параметра.Лямбда может просто выйти за пределы себя и добраться до переменных, видимых методом, в котором она определена.Это именно то, что освобождает вас от необходимости писать конструктор, который принимает baseDirectory
в качестве параметра и сохраняет его в поле _baseDirectory
, чтобы вы могли использовать его позднее несколько раз в другом методе.
Обратите внимание, чтоновая последовательность всегда будет той же длины, что и входящая последовательность.Если вы хотите отфильтровать элементы, используйте Where
.Если вы хотите сделать последовательность длиннее, используйте SelectMany
.