Как напечатать нечетный символ из строки используя powershell - PullRequest
0 голосов
/ 01 июня 2018

Я пытаюсь распечатать нечетный символ из строки Consequences, используя powershell.

приведенный ниже код работает, но есть ли другой простой способ выполнить эту задачу?как при использовании функции -split?

$student_name = "Consequences"
$out = ""
for($i = 0; $i -lt $student_name.Length ;$i++ ){
    if ($i % 2 -eq 0 ){
        $out += $student_name[$i]
    }
}
$out

она должна напечатать вывод, как показано ниже

Cneune

Ответы [ 5 ]

0 голосов
/ 05 июня 2018

Один из моих друзей предложил этот ответ, хотя его концепция совпадает.

$long_word = "Consequences"
-join ($long_word -split '(.{2})').ForEach({$_[0..0]})
0 голосов
/ 02 июня 2018

И еще два, чтобы продемонстрировать различные доступные методы.Первый использует унарную форму -join, использует тот факт, что операторы могут возвращать значения и считать на 2 вместо проверки четности числа.

$student_name = "Consequences"
-join @(for ($i = 0; $i -lt $student_name.Length; $i += 2) {
        $student_name[$i]
})

Второе решениеаналогичен первому, но использует цикл foreach и перечислитель $foreach вместо цикла for.

-join $(foreach ($c in [char[]] $student_name) {
        $c
        [void] $foreach.MoveNext()
})
0 голосов
/ 01 июня 2018

Хорошо, я сделаю правильный ответ:

$out = (0..$student_name.length | ?{($_ % 2) -eq 0} | %{$student_name[$_]}) -join ''

Получит все целые числа от 0 до количества символов в слове (0..$student_name.length).Затем он фильтрует только нечетные целые числа (?{($_ % 2) -eq 0}).Эти целые числа используются для получения каждого символа из строки в этой позиции в строке (%{$student_name[$_]}).Наконец, он берет символы и объединяет их обратно в одну строку (-join '').

0 голосов
/ 01 июня 2018

Здесь решение, основанное на .NET Linq в Powershell, вероятно, самое быстрое решение: проверьте, установлен ли первый бит индексатора для определения нечетного символа.Удалите нулевые символы из массива char и присоединитесь к строке.

$out = 'Consequences'
([Linq.Enumerable]::Select($out, [Func[char, int, char]] { param( $c, $i ) if( -not ($i -band 1) ) { $c } }) | ? {$_ -ne 0 }) -join ''
0 голосов
/ 01 июня 2018

Вы можете выполнить то, что вы пытаетесь сделать, с помощью одного foreach цикла и string методов:

$word = 'Consequences'
@(foreach ($c in ($word -split '')) {
    if ($word.IndexOf($c) % 2 -eq 0) { $c }
}) -join ''

Я использую оператор массива (@()) для принудительного вызова foreach чтобы вернуть предметы как одну коллекцию, чтобы -join работал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...