2012-02-21 14 views
5

Parece que el operador PowerShell -split y el método .NET Split() actúan completamente diferente.
.NET trata las cadenas de separación como si fueran matrices de caracteres..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 

Salida:

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


-split operator: 
Count: 1 
123456789 

¿Hay alguna manera de hacer que una aplicación .NET utilizar la misma técnica que la PowerShell, y utilizar el separador de cadena como una unidad sólida? Con suerte, sin RegEx.

Gracias.

EDIT: Esto funcionó en PowerShell, utilizando la división():

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

¡Extraño! Lo bueno es que no uso Powershell; p – leppie

Respuesta

5

.NET El método String.Split tiene dos (grupos de) sobrecargas. El primero recibe una matriz de caracteres, y el segundo una matriz de cadenas. En realidad, no hay una sobrecarga que reciba una cadena. El primero se comporta como lo describes, con cada personaje dividido individualmente. El segundo se divide a lo largo de cadenas enteras, como tú quieres.

Debido a la forma en que Powershell analiza los parámetros, una secuencia pasada a Split se analizará como una matriz de caracteres y se llamará a la primera sobrecarga. Si pudieras especificar explícitamente que el "46" es una matriz que contiene solo una cadena, debería proporcionarte el comportamiento que deseas.

9

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

Cuando usted está llamando string.Split(string), se utiliza la sobrecarga string.Split(char[]) (como string podría ser moldeado a una char[], pero no a string[]).

Para usar la sobrecarga string.Split(string[], StringSplitOptions), debe llamarlo de una manera "123456789".Split(new[] { "45" }, StringSplitOptions.None).

1

La diferencia clave es que el operador -split puede tomar una cadena o un patrón de expresión regular, mientras que el método de división solo puede tomar cadenas. El operador de división tiene muchas opciones para modificar su comportamiento. Puede encontrar más información en el documento about_split:

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

0

Otra diferencia que no vi a nadie mención es que el método .split cadena() sólo funciona en el objeto de cadena única que está llamando el método en.

El operador de división de Powershell tomará una matriz como argumento y dividirá todos los elementos de la matriz a la vez.