2012-01-26 3 views
1

У меня есть собственный класс, содержащий 2 общедоступных переменных: 1 - это строка, а 1 - целое число. Затем я создаю список этого класса. Мне нужно, чтобы строка класса была уникальной, если строка уже существует в списке, я не хочу добавлять его снова, но я хочу объединить соответствующие целые числа. здесь приведен пример пользовательского класса и списка.Сравнение одного элемента объекта в списке?

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. Я использую содержит функцию в списке, чтобы проверить, если он уже существует, но она только возвращает истину, если обе строки и integer одинаковы.

Есть ли способ соответствовать только строке?

ответ

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(); 
} 

Это, как говорится, вы действительно должны использовать словарь/хеш-таблицы вместо этого, так как словарь обеспечивает гораздо более быстрый поиск, когда вы знаете, что вы хотите. Реализация 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

Вы можете добавить Равно метод вашего класса, или используйте LINQ с чем-то вроде

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

Однако, если все, что вы делаете, это отслеживание количества «предметов», ve, будет ли словарь, который сопоставляет ItemNames, чтобы решить проблему проще? Тогда вы могли бы сделать что-то вроде

// 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; 

Обычно увидеть что-то подобное называется сумка

Смежные вопросы