Remove items contained in an ArrayList from another ArrayList in PowerShell
I've got two ArrayLists listA
and listB
. listB
is a subset of listA
.
Now I want to remove all items contained in listB
from listA
.
Here is how my lists look like:
Name ID Domain
---- -- ------
item1 456 domain1
item2 716 domain2
item3 421 domain2
item4 796 domain1
Name ID Domain
---- -- ------
item2 716 domain2
item4 796 domain1
I've already tried using
$listA = $listA | Where-Object {$listB -notcontains $_}
but this did not work on my data.
powershell arraylist compare
add a comment |
I've got two ArrayLists listA
and listB
. listB
is a subset of listA
.
Now I want to remove all items contained in listB
from listA
.
Here is how my lists look like:
Name ID Domain
---- -- ------
item1 456 domain1
item2 716 domain2
item3 421 domain2
item4 796 domain1
Name ID Domain
---- -- ------
item2 716 domain2
item4 796 domain1
I've already tried using
$listA = $listA | Where-Object {$listB -notcontains $_}
but this did not work on my data.
powershell arraylist compare
5
did you trycompare-object
?
– 4c74356b41
Nov 12 '18 at 8:30
@4c74356b41 is right. If you had simple string values in either arraylists your example would work.
– Mötz
Nov 12 '18 at 8:48
2
Your approach would only work if both lists contained the same object. It does not work if you have different objects with the same property values (identity vs. equality). UseCompare-Object
as 4c74356b41 suggested.
– Ansgar Wiechers
Nov 12 '18 at 9:08
Thanks this worked fine for me. I haven't thought about usingcompare-object
in this contaxt.
– Ramona
Nov 12 '18 at 11:51
add a comment |
I've got two ArrayLists listA
and listB
. listB
is a subset of listA
.
Now I want to remove all items contained in listB
from listA
.
Here is how my lists look like:
Name ID Domain
---- -- ------
item1 456 domain1
item2 716 domain2
item3 421 domain2
item4 796 domain1
Name ID Domain
---- -- ------
item2 716 domain2
item4 796 domain1
I've already tried using
$listA = $listA | Where-Object {$listB -notcontains $_}
but this did not work on my data.
powershell arraylist compare
I've got two ArrayLists listA
and listB
. listB
is a subset of listA
.
Now I want to remove all items contained in listB
from listA
.
Here is how my lists look like:
Name ID Domain
---- -- ------
item1 456 domain1
item2 716 domain2
item3 421 domain2
item4 796 domain1
Name ID Domain
---- -- ------
item2 716 domain2
item4 796 domain1
I've already tried using
$listA = $listA | Where-Object {$listB -notcontains $_}
but this did not work on my data.
powershell arraylist compare
powershell arraylist compare
edited Nov 12 '18 at 10:41
Ansgar Wiechers
140k12122183
140k12122183
asked Nov 12 '18 at 8:11
Ramona
689
689
5
did you trycompare-object
?
– 4c74356b41
Nov 12 '18 at 8:30
@4c74356b41 is right. If you had simple string values in either arraylists your example would work.
– Mötz
Nov 12 '18 at 8:48
2
Your approach would only work if both lists contained the same object. It does not work if you have different objects with the same property values (identity vs. equality). UseCompare-Object
as 4c74356b41 suggested.
– Ansgar Wiechers
Nov 12 '18 at 9:08
Thanks this worked fine for me. I haven't thought about usingcompare-object
in this contaxt.
– Ramona
Nov 12 '18 at 11:51
add a comment |
5
did you trycompare-object
?
– 4c74356b41
Nov 12 '18 at 8:30
@4c74356b41 is right. If you had simple string values in either arraylists your example would work.
– Mötz
Nov 12 '18 at 8:48
2
Your approach would only work if both lists contained the same object. It does not work if you have different objects with the same property values (identity vs. equality). UseCompare-Object
as 4c74356b41 suggested.
– Ansgar Wiechers
Nov 12 '18 at 9:08
Thanks this worked fine for me. I haven't thought about usingcompare-object
in this contaxt.
– Ramona
Nov 12 '18 at 11:51
5
5
did you try
compare-object
?– 4c74356b41
Nov 12 '18 at 8:30
did you try
compare-object
?– 4c74356b41
Nov 12 '18 at 8:30
@4c74356b41 is right. If you had simple string values in either arraylists your example would work.
– Mötz
Nov 12 '18 at 8:48
@4c74356b41 is right. If you had simple string values in either arraylists your example would work.
– Mötz
Nov 12 '18 at 8:48
2
2
Your approach would only work if both lists contained the same object. It does not work if you have different objects with the same property values (identity vs. equality). Use
Compare-Object
as 4c74356b41 suggested.– Ansgar Wiechers
Nov 12 '18 at 9:08
Your approach would only work if both lists contained the same object. It does not work if you have different objects with the same property values (identity vs. equality). Use
Compare-Object
as 4c74356b41 suggested.– Ansgar Wiechers
Nov 12 '18 at 9:08
Thanks this worked fine for me. I haven't thought about using
compare-object
in this contaxt.– Ramona
Nov 12 '18 at 11:51
Thanks this worked fine for me. I haven't thought about using
compare-object
in this contaxt.– Ramona
Nov 12 '18 at 11:51
add a comment |
1 Answer
1
active
oldest
votes
You can do this using the Compare-Object
cmdlet.
If your lists are like this:
$listA = @()
$listA += [PSCustomObject]@{Name = 'item1' ; ID = '456'; Domain = 'domain1'}
$listA += [PSCustomObject]@{Name = 'item2' ; ID = '716'; Domain = 'domain2'}
$listA += [PSCustomObject]@{Name = 'item3' ; ID = '421'; Domain = 'domain2'}
$listA += [PSCustomObject]@{Name = 'item4' ; ID = '796'; Domain = 'domain1'}
$listB = @()
$listB += [PSCustomObject]@{Name = 'item2' ; ID = '716'; Domain = 'domain2'}
$listB += [PSCustomObject]@{Name = 'item4' ; ID = '796'; Domain = 'domain1'}
then to remove all objects in $listA
that are also in $listB
taking all properties into account, do this:
$listA = $listA | Where-Object {(Compare-Object -ReferenceObject $_ -DifferenceObject $listB -Property Name,ID,Domain).SideIndicator -eq '<=' }
After this, $listA
will have only these two members left:
Name ID Domain
---- -- ------
item1 456 domain1
item3 421 domain2
Edit
Instead of actually naming the properties to compare like in the above, you can also collect them in a variable. For PS versions 3 and up you do this:
$props = $listA[0].psobject.properties.name
PowerShell versions below 3.0 use:
$props = $listA[0].psobject.properties | ForEach-Object { $_.name }
Then you can change the line to
$listA = $listA | Where-Object {(Compare-Object -ReferenceObject $_ -DifferenceObject $listB -Property $props).SideIndicator -eq '<=' }
This of course only if both lists have the same property names to compare..
Good point, didn't notice that - I'll remove the comment.
– LotPings
Nov 12 '18 at 14:03
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53258077%2fremove-items-contained-in-an-arraylist-from-another-arraylist-in-powershell%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
You can do this using the Compare-Object
cmdlet.
If your lists are like this:
$listA = @()
$listA += [PSCustomObject]@{Name = 'item1' ; ID = '456'; Domain = 'domain1'}
$listA += [PSCustomObject]@{Name = 'item2' ; ID = '716'; Domain = 'domain2'}
$listA += [PSCustomObject]@{Name = 'item3' ; ID = '421'; Domain = 'domain2'}
$listA += [PSCustomObject]@{Name = 'item4' ; ID = '796'; Domain = 'domain1'}
$listB = @()
$listB += [PSCustomObject]@{Name = 'item2' ; ID = '716'; Domain = 'domain2'}
$listB += [PSCustomObject]@{Name = 'item4' ; ID = '796'; Domain = 'domain1'}
then to remove all objects in $listA
that are also in $listB
taking all properties into account, do this:
$listA = $listA | Where-Object {(Compare-Object -ReferenceObject $_ -DifferenceObject $listB -Property Name,ID,Domain).SideIndicator -eq '<=' }
After this, $listA
will have only these two members left:
Name ID Domain
---- -- ------
item1 456 domain1
item3 421 domain2
Edit
Instead of actually naming the properties to compare like in the above, you can also collect them in a variable. For PS versions 3 and up you do this:
$props = $listA[0].psobject.properties.name
PowerShell versions below 3.0 use:
$props = $listA[0].psobject.properties | ForEach-Object { $_.name }
Then you can change the line to
$listA = $listA | Where-Object {(Compare-Object -ReferenceObject $_ -DifferenceObject $listB -Property $props).SideIndicator -eq '<=' }
This of course only if both lists have the same property names to compare..
Good point, didn't notice that - I'll remove the comment.
– LotPings
Nov 12 '18 at 14:03
add a comment |
You can do this using the Compare-Object
cmdlet.
If your lists are like this:
$listA = @()
$listA += [PSCustomObject]@{Name = 'item1' ; ID = '456'; Domain = 'domain1'}
$listA += [PSCustomObject]@{Name = 'item2' ; ID = '716'; Domain = 'domain2'}
$listA += [PSCustomObject]@{Name = 'item3' ; ID = '421'; Domain = 'domain2'}
$listA += [PSCustomObject]@{Name = 'item4' ; ID = '796'; Domain = 'domain1'}
$listB = @()
$listB += [PSCustomObject]@{Name = 'item2' ; ID = '716'; Domain = 'domain2'}
$listB += [PSCustomObject]@{Name = 'item4' ; ID = '796'; Domain = 'domain1'}
then to remove all objects in $listA
that are also in $listB
taking all properties into account, do this:
$listA = $listA | Where-Object {(Compare-Object -ReferenceObject $_ -DifferenceObject $listB -Property Name,ID,Domain).SideIndicator -eq '<=' }
After this, $listA
will have only these two members left:
Name ID Domain
---- -- ------
item1 456 domain1
item3 421 domain2
Edit
Instead of actually naming the properties to compare like in the above, you can also collect them in a variable. For PS versions 3 and up you do this:
$props = $listA[0].psobject.properties.name
PowerShell versions below 3.0 use:
$props = $listA[0].psobject.properties | ForEach-Object { $_.name }
Then you can change the line to
$listA = $listA | Where-Object {(Compare-Object -ReferenceObject $_ -DifferenceObject $listB -Property $props).SideIndicator -eq '<=' }
This of course only if both lists have the same property names to compare..
Good point, didn't notice that - I'll remove the comment.
– LotPings
Nov 12 '18 at 14:03
add a comment |
You can do this using the Compare-Object
cmdlet.
If your lists are like this:
$listA = @()
$listA += [PSCustomObject]@{Name = 'item1' ; ID = '456'; Domain = 'domain1'}
$listA += [PSCustomObject]@{Name = 'item2' ; ID = '716'; Domain = 'domain2'}
$listA += [PSCustomObject]@{Name = 'item3' ; ID = '421'; Domain = 'domain2'}
$listA += [PSCustomObject]@{Name = 'item4' ; ID = '796'; Domain = 'domain1'}
$listB = @()
$listB += [PSCustomObject]@{Name = 'item2' ; ID = '716'; Domain = 'domain2'}
$listB += [PSCustomObject]@{Name = 'item4' ; ID = '796'; Domain = 'domain1'}
then to remove all objects in $listA
that are also in $listB
taking all properties into account, do this:
$listA = $listA | Where-Object {(Compare-Object -ReferenceObject $_ -DifferenceObject $listB -Property Name,ID,Domain).SideIndicator -eq '<=' }
After this, $listA
will have only these two members left:
Name ID Domain
---- -- ------
item1 456 domain1
item3 421 domain2
Edit
Instead of actually naming the properties to compare like in the above, you can also collect them in a variable. For PS versions 3 and up you do this:
$props = $listA[0].psobject.properties.name
PowerShell versions below 3.0 use:
$props = $listA[0].psobject.properties | ForEach-Object { $_.name }
Then you can change the line to
$listA = $listA | Where-Object {(Compare-Object -ReferenceObject $_ -DifferenceObject $listB -Property $props).SideIndicator -eq '<=' }
This of course only if both lists have the same property names to compare..
You can do this using the Compare-Object
cmdlet.
If your lists are like this:
$listA = @()
$listA += [PSCustomObject]@{Name = 'item1' ; ID = '456'; Domain = 'domain1'}
$listA += [PSCustomObject]@{Name = 'item2' ; ID = '716'; Domain = 'domain2'}
$listA += [PSCustomObject]@{Name = 'item3' ; ID = '421'; Domain = 'domain2'}
$listA += [PSCustomObject]@{Name = 'item4' ; ID = '796'; Domain = 'domain1'}
$listB = @()
$listB += [PSCustomObject]@{Name = 'item2' ; ID = '716'; Domain = 'domain2'}
$listB += [PSCustomObject]@{Name = 'item4' ; ID = '796'; Domain = 'domain1'}
then to remove all objects in $listA
that are also in $listB
taking all properties into account, do this:
$listA = $listA | Where-Object {(Compare-Object -ReferenceObject $_ -DifferenceObject $listB -Property Name,ID,Domain).SideIndicator -eq '<=' }
After this, $listA
will have only these two members left:
Name ID Domain
---- -- ------
item1 456 domain1
item3 421 domain2
Edit
Instead of actually naming the properties to compare like in the above, you can also collect them in a variable. For PS versions 3 and up you do this:
$props = $listA[0].psobject.properties.name
PowerShell versions below 3.0 use:
$props = $listA[0].psobject.properties | ForEach-Object { $_.name }
Then you can change the line to
$listA = $listA | Where-Object {(Compare-Object -ReferenceObject $_ -DifferenceObject $listB -Property $props).SideIndicator -eq '<=' }
This of course only if both lists have the same property names to compare..
edited Nov 12 '18 at 13:48
answered Nov 12 '18 at 13:35
Theo
3,8751520
3,8751520
Good point, didn't notice that - I'll remove the comment.
– LotPings
Nov 12 '18 at 14:03
add a comment |
Good point, didn't notice that - I'll remove the comment.
– LotPings
Nov 12 '18 at 14:03
Good point, didn't notice that - I'll remove the comment.
– LotPings
Nov 12 '18 at 14:03
Good point, didn't notice that - I'll remove the comment.
– LotPings
Nov 12 '18 at 14:03
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53258077%2fremove-items-contained-in-an-arraylist-from-another-arraylist-in-powershell%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
5
did you try
compare-object
?– 4c74356b41
Nov 12 '18 at 8:30
@4c74356b41 is right. If you had simple string values in either arraylists your example would work.
– Mötz
Nov 12 '18 at 8:48
2
Your approach would only work if both lists contained the same object. It does not work if you have different objects with the same property values (identity vs. equality). Use
Compare-Object
as 4c74356b41 suggested.– Ansgar Wiechers
Nov 12 '18 at 9:08
Thanks this worked fine for me. I haven't thought about using
compare-object
in this contaxt.– Ramona
Nov 12 '18 at 11:51