Предполагая, что оба ваших файла похожи на приведенные ниже:
Original_Members.csv
Name, Member_Number
Alice, 1234
Jim, 4567
Current_Members.csv
Name, Member_Number
Alice, 4599
Jim, 4567
Вы можете сохранить исходные имена участников в System.Collections.Generic.HashSet<T>
для поиска в постоянном времени вместо линейного поиска для каждого имени. Мы можем использовать System.Linq.Enumerable.ToHashSet
для создания хэш-набора из string[]
имен.
Затем мы можем использовать Where-Object
для фильтрации текущих имен, проверяя, если хэш-набор содержит оригинальное имя с System.Collections.Generic.HashSet<T>.Contains(T)
, которое является методом O (1).
$originalMembers = Import-Csv -Path .\Original_Members.csv
$currentMembers = Import-Csv -Path .\Current_Members.csv
$originalMembersLookup = [Linq.Enumerable]::ToHashSet(
[string[]]$originalMembers.Name,
[StringComparer]::CurrentCultureIgnoreCase
)
$currentMembers |
Where-Object {$originalMembersLookup.Contains($_.Name)}
, который выведет текущие элементы, которые были исходными элементами:
Name Member_Number
---- -------------
Alice 4599
Jim 4567
Обновление
В соответствии с запросом в комментариях, если мы хотим проверить и Name
и Member_Number
, мы можем объединить обе строки, чтобы использовать их для поиска:
$originalMembers = Import-Csv -Path .\Original_Members.csv
$currentMembers = Import-Csv -Path .\Current_Members.csv
$originalMembersLookup = [Linq.Enumerable]::ToHashSet(
[string[]]($originalMembers |
ForEach-Object {
$_.Name + $_.Member_Number
}),
[StringComparer]::CurrentCultureIgnoreCase
)
$currentMembers |
Where-Object {$originalMembersLookup.Contains($_.Name + $_.Member_Number)}
, которая теперь будет возвращать только:
Name Member_Number
---- -------------
Jim 4567