Powershell奇偶数

Powershell奇偶数,powershell,Powershell,它得到一个文件作为参数,我需要文件的奇偶行中奇偶数的和 Input: 1 2 3 4 5 2 3 9 5 4 6 1 6 3 1 2 4 Output: Sum of odd numbers:(1+3+5+1)=10 Sum of even numbers:(2+6+2+4)=12 我尝试了使用foreach和不使用foreach,但我不知道如何将文件中的字符串转换为整数,并将其放入数组这是一种方法 下面的代码使用输入文件的Here字符串伪表示,但在现实生活中,您可能会使用 $fileIn =

它得到一个文件作为参数,我需要文件的奇偶行中奇偶数的和

Input:
1 2 3 4 5
2 3 9 5
4 6 1
6 3 1 2 4
Output:
Sum of odd numbers:(1+3+5+1)=10
Sum of even numbers:(2+6+2+4)=12

我尝试了使用foreach和不使用foreach,但我不知道如何将文件中的字符串转换为整数,并将其放入数组这是一种方法

下面的代码使用输入文件的Here字符串伪表示,但在现实生活中,您可能会使用

$fileIn = Get-Content -Path 'Path\To\The\FileWithNumbers.txt'
结果:

Sum of odd numbers in odd lines:   10
Sum of even numbers in even lines: 14
Sum of odd numbers in odd lines:   10 (1+3+5+1)
Sum of even numbers in even lines: 14 (2+6+2+4)
Line 0 : Sum of even numbers:(2+4)=6
Line 1 : Sum of odd numbers:(3+9+5)=17
Line 2 : Sum of even numbers:(4+6)=10
Line 3 : Sum of odd numbers:(3+1)=4
另外,您的示例输出中有一个错误:
2+6+2+4
等于14,而不是12;)


如果输出还需要显示添加的数字,则可以执行以下操作:

$oddLine = $true            # first line is an odd line
# create two collection objects to gather all the numbers
$oddNumbers  = [System.Collections.Generic.List[int]]::new()  
$evenNumbers = [System.Collections.Generic.List[int]]::new()
foreach ($line in $fileIn) {
    [int[]]$numbers = $line.Trim() -split '\s+'  # split on whitespace(s) and cast to [int]
    foreach ($n in $numbers) {
        if ($oddLine) {
            if ($n % 2) { $oddNumbers.Add($n) }
        }
        else {
            if (($n % 2) -eq 0) { $evenNumbers.Add($n) }
        }
    }
    $oddLine = !$oddLine # toggle odd and even line
}

# calculate the totals from the lists
$oddTotal  = ($oddNumbers | Measure-Object -Sum).Sum
$evenTotal = ($evenNumbers | Measure-Object -Sum).Sum

"Sum of odd numbers in odd lines:   $oddTotal ($($oddNumbers -join '+'))"
"Sum of even numbers in even lines: $evenTotal ($($evenNumbers -join '+'))"
结果:

Sum of odd numbers in odd lines:   10
Sum of even numbers in even lines: 14
Sum of odd numbers in odd lines:   10 (1+3+5+1)
Sum of even numbers in even lines: 14 (2+6+2+4)
Line 0 : Sum of even numbers:(2+4)=6
Line 1 : Sum of odd numbers:(3+9+5)=17
Line 2 : Sum of even numbers:(4+6)=10
Line 3 : Sum of odd numbers:(3+1)=4

我昨天写了这篇文章,但当我问这个问题是否是家庭作业时,我最初不想发帖。也就是说,既然其他人都在做这件事,我想我应该继续和大家分享

$Numbers = @( Get-Content 'C:\temp\numbers.txt' )
$EvenOdd = @{ 0 = 'even'; 1 = 'odd' }

For( $i = 0; $i -lt $Numbers.Count; ++$i )
{    
    $LineOdd = $i % 2
    $Sum =
    $Numbers[$i].Trim() -Split "\s+" |
    Where-Object{ $_ % 2 -eq $LineOdd } |
    Measure-Object -Sum |
    Select-Object -ExpandProperty Sum

    "Line {0} : Sum of {1} numbers:({2})={3}" -f $i, ($EvenOdd[$LineOdd]), ($NumberArray -Join '+'), $Sum
}
结果:

Sum of odd numbers in odd lines:   10
Sum of even numbers in even lines: 14
Sum of odd numbers in odd lines:   10 (1+3+5+1)
Sum of even numbers in even lines: 14 (2+6+2+4)
Line 0 : Sum of even numbers:(2+4)=6
Line 1 : Sum of odd numbers:(3+9+5)=17
Line 2 : Sum of even numbers:(4+6)=10
Line 3 : Sum of odd numbers:(3+1)=4

考虑第一行线1的一些小调整:

$Numbers = @( Get-Content 'C:\temp\numbers.txt' )
$EvenOdd = @{ 0 = 'even'; 1 = 'odd' }

For( $i = 1; $i -le $Numbers.Count; ++$i )
{    
    $LineOdd = $i % 2
    $Sum =
    $Numbers[$i-1] -Split "\s+" |
    Where-Object{ $_ % 2 -eq $LineOdd } |
    Measure-Object -Sum |
    Select-Object -ExpandProperty Sum

    "Line {0} : Sum of {1} numbers:({2})={3}" -f $i, ($EvenOdd[$LineOdd]), ($NumberArray -Join '+'), $Sum
}
注意:我最初是在一个规则空间上拆分的。我对空格的想法和来自的
.Trim()
进行了区分。我没有费心去铸造
[int]

注意:这些示例与其他示例不可比较。很明显,我们对这个问题的解释不同。如果我有时间,我会做其他的口译


分别对奇数行和偶数行中的所有数字进行交替求和:

$Numbers     = @( Get-Content 'C:\temp\numbers.txt' )
$EvenNumbers = [System.Collections.Generic.List[int]]::new()
$OddNumbers  = [System.Collections.Generic.List[int]]::new()

For( $i = 1; $i -le $Numbers.Count; ++$i )
{
    $LineOdd = $i % 2
    $NumberHash =
    $Numbers[$i-1].Trim() -Split "\s+" |
    Group-Object { $_ % 2 } -AsHashTable

    Switch ($LineOdd) 
    {
        0 { $NumberHash[0].foreach( { $EvenNumbers.Add($_) } ); Break }
        1 { $NumberHash[1].foreach( { $OddNumbers.Add($_) }  ); Break }
    }
}

$SumEven = ($EvenNumbers | Measure-Object -Sum).Sum
$SumOdd  = ($OddNumbers | Measure-Object -Sum ).Sum

"Sum of odd lines  : {0}{1}" -f "($($OddNumbers -join '+'))=",$SumOdd
"Sum of even lines : {0}{1}" -f "($($EvenNumbers -join '+'))=", $SumEven
回想起来,使用
ForEach对象{}
代替
组对象
&
开关
,这同样有效,因此我添加了另一个示例:

$Numbers     = @( Get-Content 'C:\temp\numbers.txt' )
$EvenNumbers = [System.Collections.Generic.List[int]]::new()
$OddNumbers  = [System.Collections.Generic.List[int]]::new()

For( $i = 1; $i -le $Numbers.Count; ++$i )
{
    $LineOdd = $i % 2
    $Numbers[$i-1].Trim() -Split "\s+" |
    ForEach-Object{
        If( !$LineOdd -and $_ % 2 -eq 0 ) {
            $EvenNumbers.Add($_)
        }
        Elseif( $LineOdd -and $_ % 2 -eq 1 ) {
            $OddNumbers.Add($_)
        }
    }
}

$SumEven = ($EvenNumbers | Measure-Object -Sum).Sum
$SumOdd  = ($OddNumbers | Measure-Object -Sum ).Sum

"Sum of odd lines  : {0}{1}" -f "($($OddNumbers -join '+'))=",$SumOdd
"Sum of even lines : {0}{1}" -f "($($EvenNumbers -join '+'))=", $SumEven
还有一个比上一个更有效、更雄辩的版本:

$Numbers = @( Get-Content 'C:\temp\numbers.txt' )

$Sum = @{
    0 = [System.Collections.Generic.List[int]]::new()
    1 = [System.Collections.Generic.List[int]]::new()
}

For( $i = 1; $i -le $Numbers.Count; ++$i )
{
    $LineOdd = $i % 2    
    $Numbers[$i-1].Trim() -Split "\s+" |
    ForEach-Object{ 
        If( $_ % 2 -eq $LineOdd ) {
            $Sum[$LineOdd].Add($_) 
        }
    }
}

$SumOdd  = ($Sum[1] | Measure-Object -Sum).Sum
$SumEven = ($Sum[0] | Measure-Object -Sum).Sum

"Sum of odd lines  : {0}{1}" -f "($($Sum[0] -join '+'))=", $SumOdd
"Sum of even lines : {0}{1}" -f "($($Sum[1] -join '+'))=", $SumEven
因此,这是一个改进,因为它只需要循环中的一个
If
语句。它还可以防止大量的模量计算。在上一个示例中,我有一个
If/ElseIf
ergo,每次
ElseIf
触发第二个模数计算。当然,我可以预先计算一个变量,但这不会完全删除
Else…
。相反,通过将集合存储在散列中,只需进行简单的比较即可知道要附加哪个集合


注:最后3个例子从第1行开始,考虑行1奇数。与第0行相反…

我想我也会发布我对这个问题的解决方案,当时我不想发布,因为我认为这是家庭作业,但因为已经有2个答案,而且我已经有了代码

代码非常类似于


家庭作业?;-)展示你已经尝试过的。我很确定我们可以帮你做得更进一步。这听起来很简单,但你是想分别求奇偶行的和,还是那些行上的数字,或者每行上的奇偶数。同时检查
%
(模数)运算符。这是测试偶数/奇数的典型方法。@Steven示例输出实际上解释了这一点。;-)@恩托,也许你可以看看。也就是说,我会试着从中获得一些乐趣。@Steven fun练习:P我写了一些非常类似的东西,我注意到的一件事是PS在添加到
int通用集合时会自动将
char
转换为
int
。对我来说,删除
[int[]]
效果很好。+1是一种非常酷的替代方式,似乎没有显式地这样做。诚然,我杀得太多了,但我发现模数有一点很酷。更不用说为
组对象
寻找位置的生产性斗争了。看看我在哪里有自由。另外,我在这里添加了最后一个非常酷的示例。检查一下,让我知道你的想法。谢谢谢谢@Steven,我已经把你的答案和西奥的答案投了赞成票。所有展示的例子都很好,你在回答一个我认为不值得回答的帖子时付出了很大的努力。当一个人看到自己在回答问题上付出的努力没有被注意到时,他会感到很难过:P