我有两个对象,一个引用另一个。我希望能够使用类似于Player.Inventory.Contain(Item.Attributes == "Sharp"). 我的目标是能够扫描所有物品属性的玩家库存,并检查是否有一个或多个或没有匹配。通过这种方式,我可以根据角色库存动态改变发生的事情。class Player{ public string Name { get; set; } public List<Item> Inventory { get; set; } public Player() { Inventory = new List<Item>(); }}和:public class Item{ public int ID { get; set; } public string Name { get; set; } public bool IsCarried { get; set; } public List<string> Attributes { get; set; } public Item(int id, string name) { ID = id; Name = name; Attributes = new List<string>(); } public Item(int id, string name, bool iscarried) { ID = id; Name = name; IsCarried = iscarried; Attributes = new List<string>(); }}
2 回答
qq_花开花谢_0
TA贡献1835条经验 获得超7个赞
合适的 LINQ 运算符是.Any()
. IE
player.Inventory.Any(item => item.Attributes.Contains("Sharp"))
请注意,如果属性数量变大,则性能会很差。您应该更喜欢HashSet<string>
而不是List<string>
for Attributes
,或者Dictionary<string,int>
如果相同的属性可以出现多次。
一只甜甜圈
TA贡献1836条经验 获得超5个赞
看起来您可以为此使用带有 lambda 函数的 LINQ 查询。这是一个您可以在您的 Player 类中实现的函数,用于在您的项目中查询具有特定属性名称的项目。
只读解决方案 IEnumerable<Item>
public IEnumerable<Item> FindMatchingItems(string attributeName) {
return this.Items.Where(x => x.Name == attributeName).AsEnumerable();
}
列出解决方案 List<Item>
public List<Item> FindMatchingItems(string attributeName) {
return this.Items.Where(x => x.Name == attributeName).ToList();
}
- 2 回答
- 0 关注
- 329 浏览
添加回答
举报
0/150
提交
取消