Проверка членов массива - PullRequest
0 голосов
/ 29 апреля 2018

У меня есть строка, которую я извлекаю из XML, которая ДОЛЖНА содержать целочисленные значения через запятую. В настоящее время я использую это для преобразования строки в массив и проверки каждого члена массива, чтобы увидеть, является ли он Int. В конечном счете, я все еще хочу массив в конце, так как у меня также есть массив кодов успеха по умолчанию, и я хочу объединить их. Тем не менее, я никогда не находил такой шаблон установки условия проверки истинным, затем зацикливания и, возможно, установки его в ложное значение, чтобы быть таким элегантным. Итак, мне интересно, есть ли лучший подход. Я имею в виду, что это работает, и это быстро, и код легко читается, поэтому в некотором смысле нет причин его менять, но если есть лучший способ ...

$supplamentalSuccessCode = ($string.Split(',')).Trim()
$validSupplamentalSuccessCode = $true
foreach ($code in $supplamentalSuccessCode) {
   if ($code -as [int] -isNot [int]) {
      $validSupplamentalSuccessCode = $false
   }
}

РЕДАКТИРОВАТЬ: Чтобы уточнить, этот пример является довольно конкретным, но мне любопытно более общее решение. Итак, представьте, что массив может содержать значения, которые необходимо проверить по справочной таблице, или локальные пути к дискам, которые необходимо проверить с помощью Test-Path. Поэтому, в общем, мне интересно, есть ли лучшее решение, чем Установить переменную true, foreach, если тест не пройден, установить переменную false logic. Кроме того, я поиграл с циклом while, но в большинстве ситуаций я хочу найти ВСЕ плохие значения, а не выходить из проверки первого плохого, чтобы я мог предоставить пользователю полную ошибку в журнале. Таким образом, я использую подход цикла ForEach.

1 Ответ

0 голосов
/ 29 апреля 2018

В PSv4 + вы можете заручиться помощью .Where() коллекции "оператор" до определить все недопустимые значения :

Вот упрощенный пример:

# Sample input.
$string = '10, no, 20, stillno, -1'

# Split the list into an array.
$codes = ($string.Split(',')).Trim()

# Test all array members with a script block passed to. Where()  
# As usual, $_ refers to the element at hand.
# You can perform whatever validation is necessary inside the block.
$invalidCodes = $codes.Where({ $null -eq ($_ -as [int]) })

$invalidCodes # output the invalid codes, if any

Вышеуказанные выходы:

no
stillno

Обратите внимание, что .Where() возвращает не обычный массив PowerShell ([object[]]), а экземпляр [System.Collections.ObjectModel.Collection[PSObject]], но в большинстве случаев разница не должна иметь значения.


A PSv2-совместимое решение немного более громоздко:

# Sample input.
$string = '10, no, 20, stillno, -1'

# Split the list into an array.
# Note: In PSv*3* you could use the simpler $codes = ($string.Split(',')).Trim() 
#       as in the PSv4+ solution.
$codes = foreach ($code in $string.Split(',')) { $code.Trim() }

# Emulate the behavior of .Where() with a foreach loop:
# Note that do you get an [object[]] instance back this time.
$invalidCodes = foreach ($code in $codes) { if ($null -eq ($code -as [int])) { $code } }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...