C# 避免循环内列表中的重复项
我有一个for循环,它调用其中的一个方法。我将此方法的返回添加到列表中,但是列表中会出现重复项(方法调用的最后一次返回是列表中的所有项)。这大概是因为C# 避免循环内列表中的重复项,c#,C#,我有一个for循环,它调用其中的一个方法。我将此方法的返回添加到列表中,但是列表中会出现重复项(方法调用的最后一次返回是列表中的所有项)。这大概是因为结果对象是同一个实例。有办法解决这个问题吗 IList<CarResult> carResults = new List<CarResult>(); for (int i = 0; i < cars.Count(); i++) { result = calculation.RunFo
结果
对象是同一个实例。有办法解决这个问题吗
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;
}
IList carResults=new List();
对于(int i=0;i
如果结果是相同的实例,则需要将IList替换为HashSet如果结果是相同的实例,则需要将IList替换为HashSet您需要在循环的每个过程中创建一个新的实例或结果对象,以避免通过引用carResults列表将其添加。否则,carResults中的所有项都将l保留对同一对象的引用,该对象将包含上一个循环周期的数据。您需要在循环的每个过程中创建一个新实例或结果对象,以避免通过引用carResults列表将其添加。否则,carResults中的所有项将保留对同一对象的引用,该对象将包含来自t的数据他是最后一个循环。我将做一个限定猜测,并尝试解释发生了什么,而不知道您的RunForCar()中到底发生了什么。
这大概是因为结果对象是同一个实例
可能是的
下面是一个示例。它不会创建Foo
的新实例,而是反复使用同一实例。因此,每次名称更改时,它都会更改引用上的名称。列表本身只包含引用,因此,如果您更改引用上的名称,列表中的所有项目都将更改引用
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);
}
如果我们喜欢下面的代码,我们将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);
}
有办法解决这个问题吗
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;
}
是的,您只需为每个循环创建一个新的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 carResults=new List();
对于(int i=0;i
或者,您可以在循环中使用局部变量
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;
IList carResults=new List();
对于(int i=0;i
我将做一个限定猜测,并尝试解释发生了什么,而不知道您的RunForCar()中到底发生了什么。
这大概是因为结果对象是同一个实例
可能是的
下面是一个示例。它不会创建Foo
的新实例,而是反复使用同一实例。因此,每次名称更改时,它都会更改引用上的名称。列表本身只包含引用,因此,如果您更改引用上的名称,列表中的所有项目都将更改引用
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);
}
如果我们喜欢下面的代码,我们将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);
}
有办法解决这个问题吗
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;
}
是的,您只需为每个循环创建一个新的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 carResults=new List();
对于(int i=0;i
或者,您可以在循环中使用局部变量
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;
IList carResults=new List();
对于(int i=0;i
你能把你的RunForCar
方法也贴出来吗?在上面的代码中,我想你有一个)
打字错误。问题中提供的代码似乎没问题。您可以通过使用yield-return语句(取决于方法的返回类型)简单地修改代码。请发布方法签名和RunForCar方法。根据您描述的行为,我猜您正在使用result
中的RunForCar()对象
而不是更新它。你能不能也发布你的RunForCar
方法,在上面的代码中,我认为你有一个)
打字错误。问题中提供的代码似乎没问题。您可以通过使用yield-return语句(取决于方法的返回类型)简单地修改代码。请发布方法签名和RunForCar方法。根据您描述的行为,我猜您正在使用result
对象,而不是更新它。