Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.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中的对象属性从对象列表中删除重复项_C# - Fatal编程技术网

C# 如何根据c中的对象属性从对象列表中删除重复项

C# 如何根据c中的对象属性从对象列表中删除重复项,c#,C#,我在运行时从对象列表中删除重复项时遇到问题 我想从我的对象列表中删除重复项,然后设置counter=counter+1基本对象 public class MyObject { MyObject(string name) { this.counter = 0; this.name = name; } public string name; public int counter; } List<MyObject> objects

我在运行时从对象列表中删除重复项时遇到问题

我想从我的对象列表中删除重复项,然后设置counter=counter+1基本对象

public class MyObject 
{
   MyObject(string name) 
   {
      this.counter = 0;
      this.name = name;
   }
   public string name;
   public int counter;
}

List<MyObject> objects_list = new List<MyObject>();
objects_list.Add(new MyObject("john"));
objects_list.Add(new MyObject("anna"));
objects_list.Add(new MyObject("john"));
foreach (MyObject my_object in objects_list) 
{
    foreach (MyObject my_second_object in objects_list) 
    {
        if (my_object.name == my_second_object.name) 
        {
           my_object.counter = my_object.counter + 1;
           objects_list.remove(my_second_object);
        }
    }
}
它返回一个错误,因为对象列表在运行时被修改。如何才能使其正常工作?

在Linq GroupBy的帮助下,我们可以将重复项组合到单个组中并进行处理,即返回一个表示所有重复项的项目:

 List<MyObject> objects_list = ...

 objects_list = objects_list
   .GroupBy(item => item.name)            
   .Select(group => {                            // given a group of duplicates we
      var item = group.First();                  // - take the 1st item
      item.counter = group.Sum(g => g.counter);  // - update its counter
      return item;                               // - and return it instead of group
    })
   .ToList();

另一个答案似乎是正确的,尽管我认为它会扫描整个列表两次,这取决于您的要求,这可能不够好,也可能不够好。以下是您可以一次完成的方法:

var dictionary = new Dictionary<string, MyObject>();
foreach(var obj in objects_list) 
{
  if(!dictionary.ContainsKey(obj.name)
  {
    dictionary[obj.name] = obj;
    obj.counter++;
  }
  else
  {
      dictionary[obj.name].counter++;
  } 
}

然后dictionary.Values将包含您的集合

执行for循环,而不是foreach,然后返回。这样,当您删除一个元素时,您仍然可以在列表中向上移动如果您想在迭代该列表时对列表中的元素进行mofix,请使用for而不是foreach。顺便说一下,您是在将object与object.name进行比较,这没有意义,也无法编译,我想可能是键入错误?我不能仅使用for,因为在删除过程中,迭代器将更改。另外,我不能将两个值倒过来,因为我会得到相同的错误。您也不能使用foreach来迭代一个您更改的集合,该集合也不会给出重复的数量。好吧,这个示例被简化了,但列表可以包含100000条记录:/n不确定OP想要的重复数是:我计算的重复数还是uniqeq重复数。这时,您需要创建一个字典,只需计算相同名称的重复数。如果列表包含末尾名为anna counter的MyObject,则应为1;如果列表包含末尾名为john counter的两个MyObject,则应为2。我认为这很清楚,只要稍加修改,它就可以工作了:item.counter=group.Sumg=>g.counter+1;但就我而言,我不是C语言的,它看起来有点让我困惑。实际上,如果您只编写item.counter=group.Count,它应该可以工作。你会得到每组中相同名字的数目,如果你想要的话,你可以减去一个