0

次のコードは、既存のリスト 'selectedUsers' に属していないユーザーのリストを作成します。

foreach (var childOrg in viewModel.ChildOrganizations)
{
    List<OrganizationUserViewModel> childOrgUsers = new List<OrganizationUserViewModel>();
    var users = this._organizationManager.GetOrganizationUsers(childOrg.OrganizationId);
    foreach (var user in users)
    {
        var userViewModel = Gateway.Instance.Map<User, OrganizationUserViewModel>(user.User);
        userViewModel.Organization_UserId = user.Organization_UserId;
        if (selectedUsers != null)
        {
            foreach (OrganizationUserViewModel selectedUser in selectedUsers)
            {
                if (selectedUser.UserId != userViewModel.UserId)
                {
                    childOrgUsers.Add(userViewModel);
                }
            }
        }
    }
    childOrg.Users = childOrgUsers;
}

これは、'selectedUsers' 内に 1 人のユーザーしか存在しない場合は正常に機能しますが、多数のエントリがある場合は、foreach ループの結果として新しいリストに複数の追加が行われます。どうすればこれを回避できますか?

助けてくれてありがとう。

編集:私は自分の質問を読んだところですが、本当に明確にしていないので、おそらく明確にする必要があります。foreach はリスト内の各エントリに対して実行されるため、ID が userViewModel の現在のエントリと一致しない場合、選択されたユーザーのエントリも追加されます。これらは、selectedUsers に保存されているものはすべて userViewModel に存在しないようにするため、削除に集中する必要があるものです。説明不足でごめんなさい!

4

3 に答える 3

1

わかった。私はあなたが今必要としているものを理解していると思います。これを試してみてください。

foreach (var childOrg in viewModel.ChildOrganizations)
{
    List<OrganizationUserViewModel> childOrgUsers = new List<OrganizationUserViewModel>();
    var users = this._organizationManager.GetOrganizationUsers(childOrg.OrganizationId);
    foreach (var user in users)
    {
        var userViewModel = Gateway.Instance.Map<User, OrganizationUserViewModel>(user.User);
        userViewModel.Organization_UserId = user.Organization_UserId;
        if (selectedUsers != null)
        {
            var foundUser = selectedUsers.FirstOrDefault(x => x.UserId == userViewModel.UserId);

            if(foundUser == null)
            {
                childOrgUsers.Add(userViewModel);
            }
        }
    }
    childOrg.Users = childOrgUsers.Distinct().ToList();
}
于 2013-04-22T13:41:02.177 に答える
1

質問が理解できたと思います。
メソッドから取得したすべてのユーザー ID をキャッシュしGateway.Instance.Map<User, OrganizationUserViewModel>、不足しているユーザー ID をリストに追加します。

foreach (var childOrg in viewModel.ChildOrganizations)
{
    var allUserId = new HashSet<int>();
    var users = this._organizationManager.GetOrganizationUsers(childOrg.OrganizationId);
    foreach (var user in users)
    {
        var userViewModel = Gateway.Instance.Map<User, OrganizationUserViewModel>(user.User);
        userViewModel.Organization_UserId = user.Organization_UserId;
        allUserId.Add(userViewModel.UserId);
    }

    var childOrgUsers = new List<OrganizationUserViewModel>();
    if (selectedUsers != null)
    {
        foreach (OrganizationUserViewModel selectedUser in selectedUsers)
        {
            if(allUserId.Contains(selectedUser.UserId) == false)
            {
                childOrgUsers.Add(userViewModel);
            }
        }
    }
    childOrg.Users = childOrgUsers;
}
于 2013-04-22T13:27:59.537 に答える