在 powershell 中,您可以使用..
范围符号来定义数字列表。然后,您可以使用该+=
符号添加另一个列表。例如,像这样:
$s = (1..5)
$s += (6..10)
$s
1
2
3
...
10
然后我期望您应该能够使用-=
类似的方式删除项目列表,例如使用$s -= (6..10)
. 但这导致了错误:
Method invocation failed because [System.Object[]] does not contain a method named 'op_Subtraction'
是否有一种简单的方法可以使用类似的符号删除列表中的项目?
参考:
据我所知,没有内置的简写(运算符)可以从数组/列表中删除项目。过滤
Where
器可能是实现此目的的最简单方法不幸的是,像这样的运算符
op_Subtraction
只能为自定义类/类型重载,而不能为数组等标准类型重载。您的示例数据在
System.Object[]
变量中包含整数,因此在这种情况下,您可以按值而不是按索引进行过滤,但下面的答案假设按索引过滤的更一般情况,您希望删除索引x..y
处的项目而不是带有以下内容的项目:价值观x..y
...系统对象[]
请注意,从技术上讲,加法运算符赋值不会将任何项目附加到原始数组 - 它返回一个新数组,其中包含连接两个操作数的结果:
您可以使用范围运算符对“减法”执行类似的操作,以连接要删除的索引之前的项目和要删除的索引之后的项目:
系统.ArrayList
一般来说,如果您计划执行大量“加法”和“减法”操作,那么使用像ArrayList这样的可变类型会更有效,因为在每个操作期间创建数组副本的计算成本可能会很高(CPU 和内存)。重复或使用非常大的数组。
请注意使用
Count
而非Length
ArrayList。林克
另一种稍微复杂的方法是使用
Where<TSource>(IEnumerable<TSource>, Func<TSource,Int32,Boolean>)
传递值和索引的 Linq 扩展方法重载来进行删除...这仍然会创建一个全新的数组并选择过滤后的范围进入其中,因此仍然存在需要注意的性能问题......
为了补充现有的、有用的答案,使用另一个返回新数组的值过滤替代方案:
LINQ还有一个
::Except()
方法,它有以下约束:它产生两个输入可枚举之间的集合差,即消除重复项。
虽然使用强类型输入枚举是典型的,并且通常更可取以获得更好的性能,但使用 PowerShell 的
[object[]]
类型化数组(因此能够包含特定类型的混合)作为输入也可以使用。与大多数 LINQ 方法一样,
::Except()
返回一个“惰性”枚举(按需枚举),可以通过将调用包装在数组子表达式运算符中来强制枚举@(...)
,该运算符也会生成一个[object[]]
数组作为结果。如果上述约束可以接受,那么下面的解决方案似乎比基于 - 的解决方案表现得更好
Where-Object
。PowerShell (Core) v7.3+解决方案(支持显式泛型方法调用):
在早期版本中,包括在Windows PowerShell中,您需要使用显式强制转换来引导 PowerShell 的方法重载解析(奇怪的是,强制转换输入之一似乎就足够了;另请注意,需要将范围表达式括在 中
(...)
,因为强制转换的优先级高于..
,范围运算符):由于 PowerShell 允许您使用负索引,并且还允许您反转索引顺序,为了清晰和简洁,我会执行如下操作:
您可以使用数组列表按值删除单个元素:
尝试用物体做某事。我想您需要确切的指针或对象引用来删除它。