我有三个人住在三所房子里。
- Person A(乔)住在1号房屋。
- Person B(简)住在2号房屋。
- Person C(马克斯)住在3号房屋。
我有一个按钮,用它可以为特定的人做任务分配。它变成了一种用户管理。例如:Person A有权限进入C房。
我希望能够仅显示尚未被分配的房屋。
说明如下:
- 乔是A房的所有者和B房的看守。
现在,如果我想要为他分配新角色(C房的看守),我只想在下拉列表中显示唯一未被分配的房屋C。
问题:当前所有房屋都被显示。
代码结构:
我可以创建新人员或编辑现有人员。我有一个角色分配的枚举类:
public enum RoleType
{
[Display(Name = "Owner")]
Owner = 0,
[Display(Name = "Janitor")]
Janitor = 1
}
我还有一个角色定义的模型:
public class RoleDefinitionModel
{
private RoleType? _role;
private House _selectedHouse;
public RoleDefinitionModel(IList<House> availableHouse, RoleType? selectedRole, House selectedHouse)
{
AvailableHouses = availableHouse;
_role = selectedRole;
_selectedHouse = selectedHouse;
StartChangeTracking();
}
public virtual RoleType? SelectedRole
{
get { return _role; }
set
{
if (_role == value)
return;
_role = value;
NotifyChanges();
}
}
public virtual House SelectedHouse
{
get { return _selectedHouse; }
set
{
if (_selectedHouse == value)
return;
_selectedHouse = value;
NotifyChanges();
}
}
public virtual IList<House> AvailableHouses { get; }
public virtual IList<RoleType> AvailableRoles { get; } = Enum<RoleType>.GetValues().ToList();
}
我已经有添加和删除方法,它们也能正常运行。只有一个问题:当我单击按钮时,我得到了我想要的下拉列表。但是我可以选择所有房屋,而我只想看到那些我尚未被分配角色的房屋。
public virtual void AddRoleDefinition()
{
var roleDefinition = new RoleDefinitionModel(House, null, null);
_roleDefinitions.Add(roleDefinition);
this.SubscribeChanged(roleDefinition);
}
哪种方法是最有效的检查方式:
System.Linq
中的Where()
和Any()
:
_roleDefinitions.Where(....Any());
Contains()
或者在 foreach 循环中使用
Remove()
?
for (var i = selectedHouse.Count - 1; i >= 0; --i)
{
if (availableHouses.Contains(selectedHouse[i].Uid))
{
availableHouses.Remove(selectedHouse[i]);
}
}
foreach (var selectedhouse in availableHouses)
{
...
}
然而,我认为这种方法是错误的,我的查询也是错误的。我该如何解决?