我有一个类列表,每个类都有四个属性:
**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>();
无法在线找到答案,不胜感激。
答案 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);
}
}