我有一个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;
}
答案 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
的新实例。如果不了解CarResult
或RunForCar
的更多内容,我无法说出何时最好创建新实例。但这是一个例子:
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中的所有项目都将保存对包含上一循环周期数据的同一对象的引用。