2016-09-26 63 views
0

我有一個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; 
} 
+2

你可以發佈你的'RunForCar'方法,並且在上面的代碼中,我認爲你有'''錯字。 –

+0

問題中提供的代碼似乎沒問題。您可以通過使用yield return語句簡單地實現代碼(取決於您的方法的返回類型)。請張貼方法簽名和RunForCar方法。 –

+1

根據你描述的行爲,我猜你是在'RunForCar()'裏面重新使用'result'對象,而不是_newing_ up。 – smoksnes

回答

0

如果結果是一樣的情況下,你需要用一個HashSet

0

更換的IList你需要上,以循環的每一個通創建新實例或結果的對象,以避免參考其添加到carResults列表。另外,carResults中的所有項目都將保存對包含上一個循環中的數據的同一對象的引用。

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;