在循环内避免重复列表

时间:2016-09-26 11:29:19

标签: c#

我有一个for循环,它调用其中的方法。我将此方法的返回添加到列表中但是我在列表中得到重复项(方法调用的最后一个返回是列表中的所有项)。大概这是因为result对象是同一个实例。有办法解决这个问题吗?

IList<CarResult> carResults = new List<CarResult>();

for (int i = 0; i < cars.Count(); i++)
{              
   result = calculation.RunForCar(
                engineSize[i],
                yearOfManufacture[i],

   carResults.Add(result);
}

   return carResults;
}

3 个答案:

答案 0 :(得分:3)

我要做一个合格的猜测并试着解释一下发生了什么,而不知道你RunForCar()中究竟发生了什么。

  

大概这是因为结果对象是同一个实例。

可能是的。

这是一个例子。它不会创建Foo的新实例,而是一遍又一遍地重复使用同一个实例。因此,每次更改名称时,都会更改参考上的名称。 list本身仅包含引用,因此如果更改引用上的名称,list中的所有项都将被更改。

var list = new List<Foo>();
var result = new Foo();
for(int i = 0; i < 5; i++)
{
    result.Name = i.ToString();
    list.Add(result);
}

foreach (var foo in list)
{
    Console.WriteLine(foo.Name);
}

输出:

4
4
4
4
4

如果我们改为使用下面的代码,我们会将result分配给新引用,然后我们不会触及现有的引用。

var list = new List<Foo>();
var result = new Foo();
for(int i = 0; i < 5; i++)
{
    result = new Foo()
    {
        Name = i.ToString()
    };
    result.Name = i.ToString();
    list.Add(result);
}

foreach (var foo in list)
{
    Console.WriteLine(foo.Name);
}

输出:

0
1
2
3
4
  

有解决方法吗?

是的,你可以为每个循环创建一个result的新实例。如果不了解CarResultRunForCar的更多内容,我无法说出何时最好创建新实例。但这是一个例子:

IList<CarResult> carResults = new List<CarResult>();
for (int i = 0; i < cars.Count(); i++)
{              
    result = new CarResult();
    result = calculation.RunForCar(
        engineSize[i],
        yearOfManufacture[i]); // Fixed type-o?

    carResults.Add(result);
}
return carResults;

或者你可以在循环中有一个局部变量。

IList<CarResult> carResults = new List<CarResult>();
for (int i = 0; i < cars.Count(); i++)
{              
    var result = new CarResult(); // Will not be accessible outside of loop.
    result = calculation.RunForCar(
        engineSize[i],
        yearOfManufacture[i]); // Fixed type-o?

    carResults.Add(result);
}
return carResults;

答案 1 :(得分:0)

如果结果是同一个实例,则需要将IList替换为HashSet

答案 2 :(得分:0)

您需要在循环的每次传递中创建一个新实例或结果对象,以避免通过引用carResults列表添加它。 Oterwise,carResults中的所有项目都将保存对包含上一循环周期数据的同一对象的引用。