C# 在列表中对象的一个元素上进行比较?
我有一个包含2个公共变量的自定义类:1是字符串,1是整数。然后我制作一个这个类的列表,在列表中我需要这个类的字符串是唯一的,如果这个字符串已经存在于列表中,我不想再添加它,但是我想合并相应的整数。下面是一个自定义类和列表的示例C# 在列表中对象的一个元素上进行比较?,c#,list,object,elements,contains,C#,List,Object,Elements,Contains,我有一个包含2个公共变量的自定义类:1是字符串,1是整数。然后我制作一个这个类的列表,在列表中我需要这个类的字符串是唯一的,如果这个字符串已经存在于列表中,我不想再添加它,但是我想合并相应的整数。下面是一个自定义类和列表的示例 public class myItems { public string itemName; public int count; } List<myItems> items = new List<myItems>(); myIt
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);
公共类myItems
{
公共字符串itemName;
公共整数计数;
}
列表项=新列表();
myItems e=新的myItems();
e、 symbol=“铅笔”;
e、 计数=3;
增加(e)项;
myItems e1=新的myItems();
e1.symbol=“橡皮擦”;
e1.计数=4;
增加(e1);
myItems e2=新的myItems();
e1.symbol=“铅笔”;
e1.count=3;
项目。添加(e5);
最后的清单我想包括:铅笔7,橡皮擦4。我一直在使用列表上的contains函数来检查它是否已经存在,但只有当字符串和整数都相同时,它才会返回true
有没有办法只匹配字符串?当您检查字符串是否包含并返回true时,您会得到索引并将数字添加到其中。用这个逻辑。它将起作用。当然,编写一个自定义的
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();
}
也就是说,您确实应该使用字典/哈希表,因为当您知道需要什么时,字典可以提供更快的查找。
列表
实现将导致每次您要向列表中添加MyItem
时都会搜索整个列表。另一种方法是使用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);
}
}
公共类myItems
{
公共字符串itemName;
公共整数计数;
}
列表项=新列表();
myItems e=新的myItems();
e、 symbol=“铅笔”;
e、 计数=3;
增加(项目e);
myItems e1=新的myItems();
e1.symbol=“橡皮擦”;
e1.计数=4;
添加(项目e1);
myItems e2=新的myItems();
e1.symbol=“铅笔”;
e1.count=3;
添加(项目,e5);
公共作废添加(列表列表,myItems newItem)
{
var item=list.SingleOrDefault(x=>x.symbol==newItem.symbol);
如果(项!=null)
{
item.count+=newItem.count;
}
其他的
{
列表。添加(新项);
}
}
字典可能非常适合解决此问题:
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);
}
readonly Dictionary\u dict=new Dictionary();
void InsertOrUpdate(字符串名称、整数计数)
{
int-previousCount=0;
//字典里已经有了吗?
if(_dict.TryGetValue(名称,超出先前计数))
{
//累加
计数+=以前的计数;
}
_dict[名称]=计数;
}
void Main()
{
插入更新(“铅笔”,3);
插入更新(“橡皮擦”,3);
插入更新(“铅笔”,4);
//打印出来
foreach(目录中的var项目)
Console.WriteLine(item.Key+“”+item.Value);
}
您可以将Equals方法添加到类中,或者将LINQ与以下内容结合使用
items.Where(i => i.itemName == "pencil")
然而,如果你所做的只是跟踪你有多少个“项目”,那么一个将项目名称映射到计数的字典会更容易解决你的问题吗?然后你就可以做这样的事情了
// 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;
通常会看到这样一个称为Bag的东西这并没有解决核心问题,即默认的C#相等检查只是检查引用相等,而不是值相等。@amitpatel是的,这是我尝试的,但只有当符号和计数相同时才会返回true,例如:铅笔4,铅笔4,将返回true,但是铅笔4,铅笔3会返回false,因为数字也不匹配