检查类实例是否存在某些属性

时间:2018-12-11 17:19:30

标签: c#

我有一个类列表,每个类都有四个属性:

               **Thread group**
                 **Action1** 
                 **Action2**

我想检查列表是否包含具有特定npc值的类,例如:

public class BroncoClass
{
    public NPC npc { get; set; }
    public int TimeLeft { get; set; }
    public bool Gravity { get; set; }
    public bool Rotation { get; set; }
}
public List<BroncoClass>  BroncoList = new List<BroncoClass>();

无法在线找到答案,不胜感激。

2 个答案:

答案 0 :(得分:2)

real 解决方案是将集合保存在某个地方,然后使用LINQ对其进行查询。推测此集合很容易维护,因为它将与BroncoClass一起用于所有其他操作。

更新为OP ... 您已经有了列表,只需使用list.Any(o => o.npc == testNpc)或您可能需要的任何其他谓词即可。

但是,如果您真的想做一个实际的问题:

听起来像合理使用工厂模式; 但是,您将需要有效地进行手动内存管理。您的工厂就像这样:

// Could be static, but I hate static. Don't use static.
public class BroncoFactory
{
     private List<BroncoClass> trackedObjects = new List<BroncoClass>();
     public BroncoClass New()
     {
         var newInstance = new BroncoClass();
         trackedObjects.Add(newInstance)
     }

     // Don't forget to call this or you'll leak!
     public void Free(BroncoClass instance)
     {
          trackedObjects.Remove(instance);
     }

     public bool ExistsWithNPC(NPC test)
     {
         return trackedObjects.Any(o => o.npc == test);
     }
}

真的,真的,别忘了在处理完对象后调用Free

答案 1 :(得分:1)

非常类似于@BradleyDotNET的答案。我只是将工厂作为静态方法折叠到该类中。我并不是说这是正确的方法,而是提供它作为您问题的解决方案。在类中使用静态方法似乎更接近OP的要求。

首先,我需要一个NPC类来进行编译。请注意,它实现了IEquatable,以便我可以按照自己想要的方式比较实例是否相等(并且我必须重写GetHashCode,因为这是必需条件)。

public class NPC : IEquatable<NPC>
{
    private static int _indexKeeper = 0;
    public int Index { get; } = _indexKeeper++;

    public bool Equals(NPC other)
    {
        return Index == other?.Index;
    }

    public override int GetHashCode()
    {
        return Index.GetHashCode();
    }
}

有了这,这里是BroncoClass(大部分未经测试):

public class BroncoClass
{
    private BroncoClass(int timeLeft, bool gravity, bool rotation)
    {
        Npc = new NPC();
        TimeLeft = timeLeft;
        Gravity = gravity;
        Rotation = rotation;
    }
    public NPC Npc { get; set; }
    public int TimeLeft { get; set; }
    public bool Gravity { get; set; }
    public bool Rotation { get; set; }

    private static List<BroncoClass> _instances = new List<BroncoClass>();
    public static BroncoClass Create(int timeLeft, bool gravity, bool rotation)
    {
        var bronco = new BroncoClass(timeLeft, gravity, rotation);
        _instances.Add(bronco);
        return bronco;
    }

    public static bool Remove(NPC npc)
    {
        var broncoFound = _instances.FirstOrDefault(b => b.Npc == npc);
        if (broncoFound == null)
        {
            return false;
        }

        _instances.Remove(broncoFound);
        return true;
    }

    public static BroncoClass Find(NPC npc)
    {
        return _instances.FirstOrDefault(b => b.Npc == npc);
    }

}