PowerShell 和 StringBuilder

发布于 2024-12-10 04:34:44 字数 811 浏览 0 评论 0原文

我是 PowerShell 新手,但熟悉 .NET 类。

我在 PowerShell 脚本中使用 System.Text.StringBuilder 。脚本是

Function MyStringFunc([String]$line) {
    $r = New-Object -TypeName "System.Collections.Generic.List``1[[System.String]]";
    $sb = New-Object -TypeName "System.Text.StringBuilder";

    foreach ($c in $line) {
        $sb.Append($c);
        $r.Add($sb.ToString());
    }

    return $r;
}

$line1 = "123";
$a = MyStringFunc $line1;
$a

我预期的结果是

1
12
123

但是结果是

                  Capacity                MaxCapacity                    Length
                  --------                -----------                    ------
                        16                 2147483647                         3
123

我做错了什么吗?

I am new in PowerShell but am familiar with .NET classes.

I am using System.Text.StringBuilder in PowerShell script. The script is that

Function MyStringFunc([String]$line) {
    $r = New-Object -TypeName "System.Collections.Generic.List``1[[System.String]]";
    $sb = New-Object -TypeName "System.Text.StringBuilder";

    foreach ($c in $line) {
        $sb.Append($c);
        $r.Add($sb.ToString());
    }

    return $r;
}

$line1 = "123";
$a = MyStringFunc $line1;
$a

I expected the result is

1
12
123

However the result is

                  Capacity                MaxCapacity                    Length
                  --------                -----------                    ------
                        16                 2147483647                         3
123

Did I do something wrong?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

晨曦慕雪 2024-12-17 04:34:44

StringBuilder 上的几个方法(例如 Append IIRC)会返回 StringBuilder,以便您可以调用更多 StringBuilder 方法。然而,PowerShell 的工作方式是输出所有结果(在 .NET 方法调用的情况下返回值)。在这种情况下,将结果转换为 [void] 以忽略返回值,例如:

[void]$sb.Append($c)

请注意,您不需要在 PowerShell 中以 ; 结束行。但是,如果将多个命令放在同一行,则使用 ;' 来分隔这些命令。

Several of the methods on StringBuilder like Append IIRC, return the StringBuilder so you can call more StringBuilder methods. However the way PowerShell works is that it outputs all results (return values in the case of .NET method calls). In this case, cast the result to [void] to ignore the return value e.g.:

[void]$sb.Append($c)

Note that you don't need to end lines in ; in PowerShell. However if you put multiple commands on the same line then use ;' to separate those commands.

不再让梦枯萎 2024-12-17 04:34:44

因为你说你是 PowerShell 新手。我的回答更多的是关于你编写 PowerShell 的方式。

PowerShell 是一种脚本语言,由非开发程序员(例如管理员)使用。您是一名拥有所有知识的 C# 开发人员,但您可以更简单地编写您想编写的内容。在 PowerShell 中,存在使用列表和 Hastables 的语法,请尝试以下操作:

$a = @()
$a += "Bonjour"
$a += "Salut"
$a
$a | get-member
Get-Member -InputObject $a

$rwc = @{}
$rwc += @{1="Blues"}
$rwc += @{2="Blacks"}
$rwc
$rwc | get-member
Get-Member -InputObject $rwc

这里有三个函数做同样的事情,我知道字符串构建器在内存方面效率更高一些,但在这种情况下谁在乎呢。

Function MyStringFunc([String]$line)
{ 
  $r = New-Object -TypeName "System.Collections.Generic.List``1[[System.String]]"; 
  $sb = New-Object -TypeName "System.Text.StringBuilder"; 

  foreach ($c in [Char[]]$line)
  { 
    $a = $sb.Append($c); 
    $r.Add($sb.ToString()); 
  }  
  return $r; 
} 

# A more simple way
Function MoreReadableStringFunction([String]$line)
{
  $r = @() # an untyped list

  foreach ($c in [Char[]]$line)
  { 
    $a += $c; 
    $r += $a;
  } 
  return $r;
}

# More simple but not so readable
Function MoreSimpleStringFunction([String]$line)
{
  $r = @() # an untyped list

  [Char[]]$line | % {$a += $_; $r += $a} 
  return $r;
}


Clear-Host
$line1 = "123";

$t1 = MyStringFunc $line1; 
$t1

$t2 = MoreReadableStringFunction $line1
$t2

$t3 = MoreSimpleStringFunction $line1
$t3

Because you say your are new in PowerShell. My answer is a bit more on the way you are writting PowerShell.

PowerShell is a script language, it's used by non developper programmers such as administrators. You are a C# developper with all your knowledge, but you can write the thing you want to write more simply. In PowerShell it exists syntax to use Lists and Hastables, try the following :

$a = @()
$a += "Bonjour"
$a += "Salut"
$a
$a | get-member
Get-Member -InputObject $a

$rwc = @{}
$rwc += @{1="Blues"}
$rwc += @{2="Blacks"}
$rwc
$rwc | get-member
Get-Member -InputObject $rwc

Here are three functions doing the same thing, I know that stringbuilders are a bit more efficient in memory, but in this case who cares.

Function MyStringFunc([String]$line)
{ 
  $r = New-Object -TypeName "System.Collections.Generic.List``1[[System.String]]"; 
  $sb = New-Object -TypeName "System.Text.StringBuilder"; 

  foreach ($c in [Char[]]$line)
  { 
    $a = $sb.Append($c); 
    $r.Add($sb.ToString()); 
  }  
  return $r; 
} 

# A more simple way
Function MoreReadableStringFunction([String]$line)
{
  $r = @() # an untyped list

  foreach ($c in [Char[]]$line)
  { 
    $a += $c; 
    $r += $a;
  } 
  return $r;
}

# More simple but not so readable
Function MoreSimpleStringFunction([String]$line)
{
  $r = @() # an untyped list

  [Char[]]$line | % {$a += $_; $r += $a} 
  return $r;
}


Clear-Host
$line1 = "123";

$t1 = MyStringFunc $line1; 
$t1

$t2 = MoreReadableStringFunction $line1
$t2

$t3 = MoreSimpleStringFunction $line1
$t3
以歌曲疗慰 2024-12-17 04:34:44
  1. foreach 不会迭代字符串中的字符,而是将其视为单个项目。因此,我们必须将字符串转换为 [char[]] (或使用 $line.GetEnumerator())。

  2. 表达式$sb.Append($c)获取构建器实例。在 PowerShell 中,它被写入输出。如果不需要,我们应该抑制此输出($null = ...... > $null... | Out- Null)。

这段代码产生了预期的输出:

Function MyStringFunc([String]$line) {
    $r = New-Object -TypeName "System.Collections.Generic.List``1[[System.String]]";
    $sb = New-Object -TypeName "System.Text.StringBuilder";

    foreach ($c in [char[]]$line) {
        $null = $sb.Append($c);
        $r.Add($sb.ToString());
    }

    return $r;
}

$line1 = "123";
$a = MyStringFunc $line1;
$a
  1. foreach does not iterate through characters in a string, it treats it as a single item. So that we have to cast a string to [char[]] (or use $line.GetEnumerator()).

  2. The expression $sb.Append($c) gets the builder instance. In PowerShell it gets written to the output. As far as it is unwanted we should suppress this output ($null = ... or ... > $null or ... | Out-Null).

The expected output is produced by this code:

Function MyStringFunc([String]$line) {
    $r = New-Object -TypeName "System.Collections.Generic.List``1[[System.String]]";
    $sb = New-Object -TypeName "System.Text.StringBuilder";

    foreach ($c in [char[]]$line) {
        $null = $sb.Append($c);
        $r.Add($sb.ToString());
    }

    return $r;
}

$line1 = "123";
$a = MyStringFunc $line1;
$a
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文