我有两个对象,一个引用另一个。我希望能够使用类似于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>();
}
}
答案 0 :(得分:3)
适当的LINQ运算符为 .Any()
。即
player.Inventory.Any(item => item.Attributes.Contains("Sharp"))
请注意,如果属性数量变多,性能会变差。对于HashSet<string>
,您应该首选 List<string>
,而不是Attributes
;如果同一属性可以出现多次,则应该选择Dictionary<string,int>
。
答案 1 :(得分:2)
看起来您可以为此使用带有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();
}