Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.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# - Fatal编程技术网

C# 避免循环内列表中的重复项

C# 避免循环内列表中的重复项,c#,C#,我有一个for循环,它调用其中的一个方法。我将此方法的返回添加到列表中,但是列表中会出现重复项(方法调用的最后一次返回是列表中的所有项)。这大概是因为结果对象是同一个实例。有办法解决这个问题吗 IList<CarResult> carResults = new List<CarResult>(); for (int i = 0; i < cars.Count(); i++) { result = calculation.RunFo

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

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
对象,而不是更新它。