2012-01-26 39 views
1

我有一個包含2個公共變量的自定義類:1是一個字符串,1是一個整數。然後列出這個類,在列表中,我需要該類的字符串是唯一的,如果字符串已經存在於列表中,我不想再次添加它,但我想組合相應的整數。這裏是自定義類和列表的一個例子。比較列表中的on對象的一個​​元素?

public class myItems 
{ 
    public string itemName; 
    public int count; 
} 

List<myItems> items = new List<myItems>(); 

myItems e = new myItems(); 
e.symbol = "pencil"; 
e.count = 3; 
items.Add(e); 

myItems e1 = new myItems(); 
e1.symbol = "eraser"; 
e1.count = 4; 
items.Add(e1); 

myItems e2 = new myItems(); 
e1.symbol = "pencil"; 
e1.count = 3; 
items.Add(e5); 

所以對於最終名單,我想它包含:7鉛筆,橡皮4.我一直在使用包含列表功能檢查,如果它已經存在,但它只返回true,如果這兩個字符串,並整數是相同的。

有沒有辦法只匹配字符串?

回答

2

另一種方式來做到這一點是使用LINQ:

public class myItems 
{ 
    public string itemName; 
    public int count; 
} 

List<myItems> items = new List<myItems>(); 

myItems e = new myItems(); 
e.symbol = "pencil"; 
e.count = 3; 
Add(items, e); 

myItems e1 = new myItems(); 
e1.symbol = "eraser"; 
e1.count = 4; 
Add(items, e1); 

myItems e2 = new myItems(); 
e1.symbol = "pencil"; 
e1.count = 3; 
Add(items, e5); 

public void Add(List<myItems> list, myItems newItem) 
{ 
    var item = list.SingleOrDefault(x => x.symbol == newItem.symbol); 

    if(item != null) 
    { 
     item.count += newItem.count; 
    } 
    else 
    { 
     list.Add(newItem); 
    } 
} 
-1

當你檢查它是否包含,它會反過來比你得到的索引,並添加到它的數字。使用該邏輯。它會工作。

+0

這不會去的核心問題,這是默認的C#平等檢查只檢查引用相等,而不是價值的平等。 –

+0

@amitpatel是的,這是我正在嘗試,但它只會返回true,如果符號和計數是相同的,如:鉛筆4,鉛筆4,將返回true,但鉛筆4,鉛筆3,將返回false,因爲數字不匹配以及 – Beef

0

當然,編寫自定義Equals方法

public override bool Equals(object o) 
{ 
    MyItems mi = o as MyItems; 
    if (mi == null) 
     return false; 
    if (itemName == null) 
     return mi.itemName == null; 
    return itemName.Equals(mi.itemName); 
} 

public override int HashCode() 
{ 
    return (itemName ?? string.Empty).HashCode(); 
} 

話雖這麼說,你真的應該使用字典/哈希表來代替,因爲一本字典提供更快的查找,當你知道你想要什麼。 A List實現將導致列表在每次要將MyItem添加到列表中時全部搜索。

1

字典可能是非常適合這個問題:

readonly Dictionary<string, int> _dict = new Dictionary<string, int>(); 

void InsertOrUpdate(string name, int count) 
{ 
    int previousCount = 0; 

    // item already in dictionary? 
    if (_dict.TryGetValue(name, out previousCount)) 
    { 
     // add to count 
     count += previousCount; 
    } 

    _dict[name] = count; 
} 

void Main() 
{ 
    InsertOrUpdate("pencil", 3); 
    InsertOrUpdate("eraser", 3); 
    InsertOrUpdate("pencil", 4); 

    // print them 
    foreach (var item in _dict) 
     Console.WriteLine(item.Key + " " + item.Value); 
} 
1

您可以添加一個equals方法到類,或使用LINQ喜歡的東西

items.Where(i => i.itemName == "pencil") 

但是,如果你正在做的是保持跟蹤你有多少個「項目」哈ve,會將itemNames映射到計數的Dictionary解決你的問題更容易嗎?然後,你將能夠做的事情一樣

// Assuming you want to add a new 'pencil' with a count of 3 
int oldCount = 0; 
items.TryGetValue("pencil", out oldCount); 

items["pencil"] = oldCount + 3; 

通常看到這樣的事情叫做袋