C# 比较列表的值
另一个问题。现在我想将一个项目的数量与另一个项目的数量进行比较,如果第一个项目的数量大于或等于第二个项目,则返回trueC# 比较列表的值,c#,C#,另一个问题。现在我想将一个项目的数量与另一个项目的数量进行比较,如果第一个项目的数量大于或等于第二个项目,则返回true public bool Equals(Item item1, Item item2) { if (item1.ItemName.Equals(item2.ItemName) && item1.ItemCount >= item2.ItemCount) { return true; } 但不管第一项的数量是多少,它
public bool Equals(Item item1, Item item2)
{
if (item1.ItemName.Equals(item2.ItemName) && item1.ItemCount >= item2.ItemCount)
{
return true;
}
但不管第一项的数量是多少,它总是返回true。这段代码有问题吗?还是其他地方有问题
var commonItems = Items.Intersect(Inventory.Items, new ListComparer()).ToList();
if (commonItems.Count() == Items.Count())
{
return Output;
}
这就是我比较清单的地方。Items将具有Item类的3个对象。一块石头,一根树枝和两棵藤蔓。这是比较我的库存,即使我只有1藤它返回真
忘记添加第一个代码块在一个名为
public class ListComparer :IEqualityComparer<Item>
公共类ListComparer:IEqualityComparer
所以你有一个“食谱”,比如[1块石头,1根树枝,3棵藤蔓]
,你想知道你的库存中是否有至少符合要求数量的所有物品
以下是您可以使用的一种方法:
if (Recipe.All(r => Inventory.Any(i =>
i.Name == r.Name && i.ItemCount >= r.ItemCount))))
因此,“如果每个配方项目至少与所需数量的库存项目匹配”。这是假设两个列表中都没有多个堆栈
你不应该做的是重新定义
Equals
来表示除“Equals”之外的任何内容。很多框架代码都是在假设Equals将持续工作的情况下工作的——例如,A.Equals(b)的结果将与b.Equals(A)的结果相同。这可能是目前让您感到困惑的原因,因为您的代码没有提供此功能,而Intersect
方法将依赖它。我在您的代码中没有看到任何列表。问题在于Item类的ItemCount成员(如果您的项目与确切名称匹配-区分大小写)呃,您正在破坏Equals
的语义(请参阅本页的一半)。奇怪的事情就要发生了。如果a等于b,那么b应该等于a。你想用它实现什么?像minecraft或terrariaOK这样的工艺系统,稍微宽泛一点,你想从返回输出的代码中得到什么?你在检查两个列表是否包含相同的项目吗?这对我来说更有意义。r和i变量来自哪里?啊,这是lambda语法。它们就像foreach
变量,基本上-r
将依次设置到配方中的每个项目,例如。哦,我有一个大脑放屁。。。但这仍然不能正常工作。我可以有1个vine,输出仍将返回。找到错误。列表中的ItemCount变量设置错误。但这现在起作用了:)