2012-01-26 40 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; 

通常看到这样的事情叫做袋