Title: Close the feature gap between the `Where-Object` cmdlet and the `.Where()` array method, introduce -First, -Last, ... switches · Issue #13834 · PowerShell/PowerShell · GitHub
Open Graph Title: Close the feature gap between the `Where-Object` cmdlet and the `.Where()` array method, introduce -First, -Last, ... switches · Issue #13834 · PowerShell/PowerShell
X Title: Close the feature gap between the `Where-Object` cmdlet and the `.Where()` array method, introduce -First, -Last, ... switches · Issue #13834 · PowerShell/PowerShell
Description: Summary of the new feature/enhancement Update for clarification: The gist of this proposal is to bring valuable filter functionality that currently only exists in the in-memory .Where() array method to its pipeline counterpart, Where-Obj...
Open Graph Description: Summary of the new feature/enhancement Update for clarification: The gist of this proposal is to bring valuable filter functionality that currently only exists in the in-memory .Where() array metho...
X Description: Summary of the new feature/enhancement Update for clarification: The gist of this proposal is to bring valuable filter functionality that currently only exists in the in-memory .Where() array metho...
Opengraph URL: https://github.com/PowerShell/PowerShell/issues/13834
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"Close the feature gap between the `Where-Object` cmdlet and the `.Where()` array method, introduce -First, -Last, ... switches","articleBody":"## Summary of the new feature/enhancement\r\n\r\n_Update for clarification_: **The gist of this proposal is to bring valuable filter functionality that currently only exists in the _in-memory_ `.Where()` array method to its _pipeline_ counterpart, `Where-Object`.**\r\n(Always using `.Where()` isn't an option with large input sets, because you'd have to collect all input in memory first.)\r\n\r\n\r\nThe [`.Where()` array method](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_Arrays#where), which is the in-memory equivalent of the pipeline-based `Where-Object` cmdlet, offers a number of additional features, such as the ability to optionally stop matching after the first match is found, which can be an important optimization technique, and the ability to output all objects that come before/after a matching one:\r\n\r\n`First` / `-First` example:\r\n\r\n```powershell\r\n# OK - very fast, because - despite the large input collection - processing stops after the first match.\r\n(1..1e6).Where({ $_ -eq 10 }, 'First') # -\u003e 10\r\n\r\n# WISHFUL THINKING: Add a -First switch (among several others - see below).\r\n1..1e6 | Where-Object { $_ -eq 10 } -First\r\n\r\n# Without it, ALL elements are processed - SLOW\r\n1..1e6 | Where-Object { $_ -eq 10 }\r\n\r\n# Current workaround is cumbersome.\r\n1..1e6 | Where-Object { $_ -eq 10 } | Select-Object -First 1\r\n```\r\n\r\n`SkipUntil` / `-SkipUntil` example:\r\n\r\n```powershell\r\n(1, 2, 42, 43).Where({ $_ -eq 42 }, 'SkipUntil') # -\u003e 42, 43\r\n\r\n# WISHFUL THINKING: Add a -SkipUntil switch.\r\n1, 2, 42, 43 | Where-Object { $_ -eq 42 } -SkipUntil\r\n```\r\n\r\nBased on the current `.Where()` features, the following switches should be introduced with the same behavior, mirroring the [`WhereOperatorSelectionMode`](https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.whereoperatorselectionmode) enumeration values:\r\n\r\n`-First`, `-Last`, `-SkipUntil`, `-Until`, `-Split`\r\n\r\nNote:\r\n\r\n* `-Split` partitions the input into two and returns two collections, so it would in effect require collecting all input in memory first before producing output, which would have to be clearly documented.\r\n\r\n* The `.Where()` method has an optional numeric parameter, `numberToReturn`, that modifies the operations, such as `2` with `First` returning the first _two_ matches; since we don't have a syntax for switches with _optional (non-Boolean) arguments_ for commands (see #12104), we have the following options:\r\n\r\n * Option A: Simply omit this aspect of the functionality and invariably default to `1`, which is likely fine in the majority of cases; if a different number is needed, `Select-Object -First/-Last $n` can be piped to.\r\n\r\n * Option B: Implement `-First` and `-Last not as _switches, but as `-First \u003cint\u003e` and `-Last \u003cint\u003e` ; the potential downside is that a number argument is then _mandatory_.\r\n\r\n * Option C: Given that `numberToReturn` also modifies all other functionality - though there's likely less of a need for that - implement a separate `-Count \u003cint\u003e` parameter, which in the absence of any of the switches would imply `-First`.\r\n\r\n* For these behaviors to be implemented efficiently, they have to stop the pipeline on demand, as `Select-Object` already does. However, the latter does so in a problematic fashion - not giving other cmdlets a chance to run their `End` blocks - which should be addressed (independently) as well: see #7930\r\n\r\n\r\n**On a meta note: You can skip the obsolete comments that follow and resume reading at [this comment](https://github.com/PowerShell/PowerShell/issues/13834#issuecomment-714686798).**","author":{"url":"https://github.com/mklement0","@type":"Person","name":"mklement0"},"datePublished":"2020-10-22T14:22:30.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":32},"url":"https://github.com/13834/PowerShell/issues/13834"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:f8f211e2-bc56-363a-2622-2a03bfbb02af |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | C1C6:1DE205:15D415C:1F23DED:6A5A29F6 |
| html-safe-nonce | 682a3b19db990428db988cea10fa36784ddcfb23679a2d80ef62cae16462cf95 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJDMUM2OjFERTIwNToxNUQ0MTVDOjFGMjNERUQ6NkE1QTI5RjYiLCJ2aXNpdG9yX2lkIjoiMzY1Mzg5ODA5OTc3MTQ1MTg5NCIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9 |
| visitor-hmac | cdd03a7834c5d5e3c2db5bdcd4e09f6cea4dddec49ca6cd75112d012ffe5b662 |
| hovercard-subject-tag | issue:727436890 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/PowerShell/PowerShell/13834/issue_layout |
| twitter:image | https://opengraph.githubassets.com/be31759b65b425242f580f6f12cce3a23564a8a676dcde7c13cdbd31b62fc852/PowerShell/PowerShell/issues/13834 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/be31759b65b425242f580f6f12cce3a23564a8a676dcde7c13cdbd31b62fc852/PowerShell/PowerShell/issues/13834 |
| og:image:alt | Summary of the new feature/enhancement Update for clarification: The gist of this proposal is to bring valuable filter functionality that currently only exists in the in-memory .Where() array metho... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | mklement0 |
| hostname | github.com |
| expected-hostname | github.com |
| None | 19c67ad7579d2401ff06e88a32ef45460fbb40fab3191c7f7582d5e166f326fc |
| turbo-cache-control | no-preview |
| go-import | github.com/PowerShell/PowerShell git https://github.com/PowerShell/PowerShell.git |
| octolytics-dimension-user_id | 11524380 |
| octolytics-dimension-user_login | PowerShell |
| octolytics-dimension-repository_id | 49609581 |
| octolytics-dimension-repository_nwo | PowerShell/PowerShell |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 49609581 |
| octolytics-dimension-repository_network_root_nwo | PowerShell/PowerShell |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | a3dea2706161c733403beb02e41d5765d358d44e |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width