Remove items contained in an ArrayList from another ArrayList in PowerShell











up vote
0
down vote

favorite












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.










share|improve this question




















  • 5




    did you try compare-object?
    – 4c74356b41
    Nov 12 at 8:30










  • @4c74356b41 is right. If you had simple string values in either arraylists your example would work.
    – Mötz
    Nov 12 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 at 9:08










  • Thanks this worked fine for me. I haven't thought about using compare-object in this contaxt.
    – Ramona
    Nov 12 at 11:51















up vote
0
down vote

favorite












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.










share|improve this question




















  • 5




    did you try compare-object?
    – 4c74356b41
    Nov 12 at 8:30










  • @4c74356b41 is right. If you had simple string values in either arraylists your example would work.
    – Mötz
    Nov 12 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 at 9:08










  • Thanks this worked fine for me. I haven't thought about using compare-object in this contaxt.
    – Ramona
    Nov 12 at 11:51













up vote
0
down vote

favorite









up vote
0
down vote

favorite











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.










share|improve this question















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






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 12 at 10:41









Ansgar Wiechers

139k12120183




139k12120183










asked Nov 12 at 8:11









Ramona

689




689








  • 5




    did you try compare-object?
    – 4c74356b41
    Nov 12 at 8:30










  • @4c74356b41 is right. If you had simple string values in either arraylists your example would work.
    – Mötz
    Nov 12 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 at 9:08










  • Thanks this worked fine for me. I haven't thought about using compare-object in this contaxt.
    – Ramona
    Nov 12 at 11:51














  • 5




    did you try compare-object?
    – 4c74356b41
    Nov 12 at 8:30










  • @4c74356b41 is right. If you had simple string values in either arraylists your example would work.
    – Mötz
    Nov 12 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 at 9:08










  • Thanks this worked fine for me. I haven't thought about using compare-object in this contaxt.
    – Ramona
    Nov 12 at 11:51








5




5




did you try compare-object?
– 4c74356b41
Nov 12 at 8:30




did you try compare-object?
– 4c74356b41
Nov 12 at 8:30












@4c74356b41 is right. If you had simple string values in either arraylists your example would work.
– Mötz
Nov 12 at 8:48




@4c74356b41 is right. If you had simple string values in either arraylists your example would work.
– Mötz
Nov 12 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 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 at 9:08












Thanks this worked fine for me. I haven't thought about using compare-object in this contaxt.
– Ramona
Nov 12 at 11:51




Thanks this worked fine for me. I haven't thought about using compare-object in this contaxt.
– Ramona
Nov 12 at 11:51












1 Answer
1






active

oldest

votes

















up vote
1
down vote













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..






share|improve this answer























  • Good point, didn't notice that - I'll remove the comment.
    – LotPings
    Nov 12 at 14:03











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',
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
});


}
});














draft saved

draft discarded


















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








up vote
1
down vote













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..






share|improve this answer























  • Good point, didn't notice that - I'll remove the comment.
    – LotPings
    Nov 12 at 14:03















up vote
1
down vote













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..






share|improve this answer























  • Good point, didn't notice that - I'll remove the comment.
    – LotPings
    Nov 12 at 14:03













up vote
1
down vote










up vote
1
down vote









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..






share|improve this answer














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..







share|improve this answer














share|improve this answer



share|improve this answer








edited Nov 12 at 13:48

























answered Nov 12 at 13:35









Theo

3,3111518




3,3111518












  • Good point, didn't notice that - I'll remove the comment.
    – LotPings
    Nov 12 at 14:03


















  • Good point, didn't notice that - I'll remove the comment.
    – LotPings
    Nov 12 at 14:03
















Good point, didn't notice that - I'll remove the comment.
– LotPings
Nov 12 at 14:03




Good point, didn't notice that - I'll remove the comment.
– LotPings
Nov 12 at 14:03


















draft saved

draft discarded




















































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.




draft saved


draft discarded














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





















































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







Popular posts from this blog

Guess what letter conforming each word

Port of Spain

Run scheduled task as local user group (not BUILTIN)