2012-02-21 2 views
5

Кажется, что оператор PowerShell -split и метод .NET Split() действуют совершенно иначе.
.NET рассматривает строки разделителя, как если бы они были массивами символов..NET String Split()

$str = "123456789" 
Write-Host ".NET Split(): " 
$lines = $str.Split("46") 
Write-Host "Count: $($lines.Length)" 
$lines 

$str = "123456789" 
Write-Host "-split operator: " 
$lines = $str -split "46" 
Write-Host "Count: $($lines.Length)" 
$lines 

Выход:

.NET Split(): 
Count: 3 
123 
5 
789 


-split operator: 
Count: 1 
123456789 

Есть ли способ, чтобы сделать приложение .NET использовать ту же технику, как PowerShell и использовать строку разделитель в единое целое? Надеюсь, без RegEx.

Спасибо.

EDIT: Это работало в PowerShell, используя Split():

Write-Host "Divided by 46:" 
"123456789".Split([string[]] "46", [StringSplitOptions]::None) 

Write-Host "`n`nDivided by 45:" 
"123456789".Split([string[]] "45", [StringSplitOptions]::None) 


Divided by 46: 
123456789 


Divided by 45: 
123 
6789 
+0

Странно! Хорошо, что я не использую Powershell; p – leppie

ответ

5

Метод .NET String.Split имеет две (группы) перегрузок. Первый принимает массив символов, а второй - строковый массив. На самом деле нет перегрузки, которая получает строку. Первый ведет себя так, как вы описываете, причем каждый персонаж разбивается по отдельности. Второй расщепляется вдоль целых строк, как вы этого хотите.

Из-за того, как Powershell анализирует параметры, строка, переданная в Split, будет анализироваться как массив символов и первая вызванная перегрузка. Если вы можете явно указать, что «46» - это массив, содержащий только одну строку, он должен дать вам поведение, которое вы хотите.

9

http://msdn.microsoft.com/en-us/library/system.string.split.aspx

Когда вы звоните string.Split(string), он использует перегрузку string.Split(char[]) (как string может быть литыми к char[], но не string[]).

Чтобы использовать перегрузку string.Split(string[], StringSplitOptions), вы должны позвонить ему в пути "123456789".Split(new[] { "45" }, StringSplitOptions.None).

1

Главное отличие состоит в том, что оператор -split может принимать строку или шаблон регулярного выражения, в то время как метод Split может принимать только строки. Оператор -split имеет множество возможностей для настройки его поведения. Вы можете найти более подробную информацию в about_split документа:

http://technet.microsoft.com/en-us/library/dd347708.aspx

0

Еще одно различие я не видел никого упоминания о том, что строка .split() метод работает только на одном объекте строки вы звоните метод на.

Оператор Powershell -split будет принимать массив как аргумент и сразу же разбивать все элементы массива.