gpt4 book ai didi

c# - 比较多个列表时删除相同的值

转载 作者:太空狗 更新时间:2023-10-30 01:12:35 24 4
gpt4 key购买 nike

我有 3 个人住在 3 栋房子里。

  • A (Joe) 住在房子 1。
  • B (Jane) 住在房子 2。
  • C (Max) 住在 3 号房子里。

我有一个按钮,可以用来为某些人分配任务。它成为一种用户管理。 例如A 人有权进入 C 屋。

我希望能够只显示尚未分配的房屋。

图示如下:

  • Joe 是 A 屋的主人和 B 屋的管理员。

如果我现在想给他分配一个新角色(C 房子的管理员),我只想在下拉列表中显示 C 房子(唯一未分配的房子)。

enter image description here

问题:当前显示所有房屋。

代码结构:

我可以创建新人或编辑现有人。我有一个用于角色分配的枚举类:

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);
}

哪种检查方式最有效:

  • Where()Any() 来自 System.Linq:

_roleDefinitions.Where(....Any());

  • 包含()

  • 或在 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)
{
...
}

但是,我认为这种方法是错误的,我的查询在这里是错误的。我该如何解决这个问题?

最佳答案

你能不能给你的房子对象添加一个属性,比如:

public House()
{
...
public bool HasBeenAssigned
{
get;
set;
}
}

然后使用 LINQ 仅选择那些尚未分配的 House 对象

public List<House> AvailableHouses 
{
return ListOFHouses.Where(house => !house.HasBeenAssigned).Select(item => item).toList();
}

关于采用哪种方法,我会建议 - 根据它在我的回答 LINQ 中的使用。

foreach 循环没有任何问题 - 但是,正如您所看到的,LINQ 语句更具可读性、可维护性、优雅性,并且它的显示意图。

在这种情况下,使用 Where 子句会更合适 - 我们正在查找房屋列表 ,其中 的 HasBeenAssigned 值为 false。这将返回一个可枚举的列表,我们选择它并将其转换为列表。

我们对是否存在暗示 bool 结果的any 不感兴趣。事实上,Any 子句将返回一个 bool 列表。

关于c# - 比较多个列表时删除相同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57972829/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com