为了账号安全,请及时绑定邮箱和手机立即绑定

在所有类 List<Object> 中搜索匹配值

在所有类 List<Object> 中搜索匹配值

C#
红颜莎娜 2021-11-14 17:04:11
我有两个对象,一个引用另一个。我希望能够使用类似于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>如果相同的属性可以出现多次。


查看完整回答
反对 回复 2021-11-14
?
一只甜甜圈

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

}


查看完整回答
反对 回复 2021-11-14
  • 2 回答
  • 0 关注
  • 329 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信