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

时间:2018-08-03 21:37:45

标签: c# linq

我有两个对象,一个引用另一个。我希望能够使用类似于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 个答案:

答案 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();
    }