arrays - 需要有关创建新对象以在比较后存储用户信息的指导
问题描述
我有一些代码将在下面显示;使用 LINQ 比较 2 个对象。我有 2 个变量。一个是需要添加的新项目的比较,另一个是需要删除的项目的比较。
当我进行比较时,它工作正常,但它首先比较名字,然后是中间名,然后是姓氏等等。当我在最后打印出变量时,它会以相同的顺序打印出来。首先是名字,然后是中间名首字母,然后是姓氏......
我想要做的是将它组织在一个按顺序输出的表中,例如它输出用户及其所有属性。
这是我的代码。
#Our Array of values we will be comparing
[array]$CompareValues = "FirstName","MiddleName","LastName","DisplayName","Email","Mobile","TelephoneNumber","Title","Dept","Company"
for($i=0; $i -lt $CompareValues.Count; $i++)
{
#First let's create 2 variables that will hold the info we want
$A = ($Users).($CompareValues[$i])
$B = ($Contacts).($CompareValues[$i])
##################### Compare existing contacts to Users #####################
#Only Run if there are contacts; otherwise there is nothing for us to compare
if(($NULL -ne $B))
{
#Displays what accounts we need to import
$NeedsToBeAdded += [string[]]([Linq.Enumerable]::Except([object[]]$a, [object[]]$b))
#Displays what accounts we need to delete because they no longer exist
$NeedsToBeDeleted += [string[]]([Linq.Enumerable]::Except([object[]]$b, [object[]]$a))
}
}
这是它的打印方式(例如)
Bob
Mary
John
Jones
Joe
Nowak
Bjones
Mjoe
Jnowak
bjones@domain.com
mjoe@domain.com
jnowak@domain.com
123-456-7890
123-456-7891
123-456-7892
Manager
Accountant
Engineer
HR
Accounting
IT
CompanyName
CompanyName
CompanyName
这是我希望它作为示例打印的方式(不需要分隔符,我只是使用逗号来提高可读性)
Bob , , Jones, Bjones, bjones@domain.com, 123-456-7890, , Manager, HR, CompanyName
Mary , , joe, Mjoe, mjoe@domain.com, 123-456-7891, , Accountant, Accounting, CompanyName
John , , Nowak, Jnowak, jnowak@domain.com, 123-456-7892, , Engineer, IT, CompanyName
我怎样才能实现这样的目标?我的最终目标是在我将所有内容正确存储在变量中之后,我将遍历每个对象,然后更新联系人列表,要么添加具有上述属性的新用户,要么删除用户及其联系信息,因为它们不再存在.
解决方案
首先,如果该特定值不在列表中,您只会更新联系人,这将导致问题。例如,让我们看一下姓氏:
$Users.LastName $Contacts.LastName
--------------- ------------------
Smith Joe #
Joe-Jones Joe #
Smith Nowak ## These three changed
Smith Smith
Joe Joe
Nowak Nowak
如果您要按名称比较它们,您的脚本将只返回一个新条目。在这里,两个用户已将他们的姓氏更改为 smith:
$A = ($Users).LastName
$B = ($Contacts).LastName
$NeedsToBeAdded += [string[]]([Linq.Enumerable]::Except([object[]]$a, [object[]]$b))
$NeedsToBeAdded
#Outputs:
Joe-Jones # Missing two changes!
“Smith”已经在联系人列表中,所以看不出有什么不同。
相反,您需要比较每个完整对象,或者使用某种唯一 ID 来匹配用户和联系人。您所拥有的最简单的答案是Compare-Object
在其中添加要比较的所有属性:
$Diff = Compare-Object $Users $Contacts -Property FirstName,LastName,Email -PassThru
$NeedsToBeAdded = $diff | Where SideIndicator -eq '=>'
$NeedsToBeDeleted = $diff | Where SideIndicator -eq '<='
-PassThru
让它输出原始对象:
$NeedsToBeAdded | ft FirstName,LastName,Email
FirstName LastName Email
--------- -------- -----
Bob Smith bjones@domain.com
Mary Joe-Jones mjoe@domain.com
John Smith jnowak@domain.com
推荐阅读
- c# - OnTriggerEnter 和 OnTriggerExit 没有按计划工作,为什么我的层次结构有问题?
- javascript - 如何将数组数据从表单传递到状态?
- django - 如何使用显示名称搜索选择字段?
- java - 在 ELEMENT_NODE 的情况下,node.getNodeType 无法按预期工作
- logstash - 安装 logstash-filter-rest 消息时显示错误:证书验证失败
- android - 迁移到 New Places SDK 客户端请求 Play 商店的 ACCESS_FINE_LOCATION 权限
- java - 类加载,静态块
- python - 在 Django 命令测试中使用两个不同的数据集修补外部 API 调用
- entity-framework-core - EF Core 可以跟踪非最高投影中的实体吗?
- apache-spark - 基于 Direct Stream 的 SparkStreaming 与 Kafka 仅显示一个 Consumer-ID