Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在列表中对象的一个元素上进行比较?_C#_List_Object_Elements_Contains - Fatal编程技术网

C# 在列表中对象的一个元素上进行比较?

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

我有一个包含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);
公共类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,因为数字也不匹配