2014-10-09 131 views
0

比較問題的另一個列表。我現在想要將一個項目的數量與另一個數量進行比較,如果第一個項目的數量大於或等於第二個項目,則返回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; 
} 

這是我在比較列表。項目將有3個類Item的對象。 1塊岩石,1枝樹枝和2棵葡萄藤。這與我的庫存進行比較,即使我只有1個葡萄藤,它也會返回true。

忘了補充一點,第一個代碼塊是在一個名爲

public class ListComparer :IEqualityComparer<Item> 
+1

我在代碼中看不到任何列表。 – MarcinJuraszek 2014-10-09 00:54:12

+0

問題必須是Item類的ItemCount成員(提供的項目匹配EXACT名稱 - 區分大小寫) – 2014-10-09 00:56:23

+0

呃,你打破了'Equals'的語義(參見[guidelines](http://msdn.microsoft .com/en-us/library/bsc2ak47.aspx) - 在頁面的中間位置)。奇怪的事情將會發生。如果a等於b,那麼b應該等於a。你想用這個做什麼? – Blorgbeard 2014-10-09 01:21:38

回答

1

所以,你有一個「祕方」之類[1 rock, 1 twig, 3 vine]類,和你想知道你的庫存有至少所有項目所需數量。

這裏是你可以用一個辦法:

if (Recipe.All(r => Inventory.Any(i => 
    i.Name == r.Name && i.ItemCount >= r.ItemCount)))) 

所以,「如果每一個配方項目庫存項目匹配至少需要的量」。這是假設任何列表中都不會有多個堆棧。

你不應該做的是重新定義Equals意味着除「等於」之外的任何內容。很多框架代碼都是在Equals將始終如一的假設下工作的 - 例如,a.Equals(b)的結果將與b.Equals(a)相同。這可能是你目前絆倒你的原因,因爲你的代碼沒有提供這個,並且Intersect方法將依賴它。

+0

這對我來說更有意義。 r和i變量來自哪裏? – 2014-10-09 01:52:58

+0

啊,這是lambda語法。它們就像'foreach'變量,基本上''r'將依次被設置爲'Recipe'中的每個項目。 – Blorgbeard 2014-10-09 01:58:03

+0

哦,我有一個大腦放屁...但這仍然無法正常工作。我可以有1個葡萄藤,產量仍然會被退回。 – 2014-10-09 01:59:19