2015-10-17 40 views
0
public static List<Client> GetAllClients() 
    { 
     return new List<Client> 
     { 
      new Client(e: 1, d: 1998, a: "Tom Johnson", b: "+32273", c: "Honda Civic"), 
      new Client("sarah jackson", "88777793483254459", "subaru Forester", 2005, 2), 
      new Client("jack thompson", "+37083227359", "audi 100", 1992), 
      new Client("tomas jonauskas", "+37183227359", "tesla model s", 2014, 3), 
      new Client("egle tomiene", "+00483227359", "volkswagen golf", 2010), 
      new Client("jonas petrauskas", "8482359", "peugeot 206", 2000, 2) 

     }; 
    } 

非常簡單的問題。 此方法返回一個新生成的列表,但如果我更改其他類中的某些對象,我會得到相同的列表。有沒有辦法在不破壞這種方法的情況下返回已編輯的列表?謝謝。如何編輯我的列表?

這是我嘗試驗證的正則表達式,但輸出是相同的列表無論我嘗試更改。

internal class Regexes 
{ 
    public static void ValidatePhone() 
    { 
     Regex regex = new Regex(@"Someregex"); 
     for (int i = 0; i < Program.GetAllClients().Count; i++) 
     { 
      if (!regex.IsMatch(Program.GetAllClients()[i].Phone))    
       Program.GetAllClients()[i].Phone = "[Invalid phone number]"; 
      } 
     } 
    } 
} 

對不起,問這樣一個新手問題。

+1

目前尚不清楚「返回編輯列表」的含義。當代碼調用此方法並取回列表時,該代碼可以對該列表進行任何更改。你想要做什麼以及你的代碼不工作的方式是什麼? – David

+0

@David添加了一些代碼。希望能幫助到你。 –

+0

'Program.GetAllClients()'這是每次都返回新的列表。在每次迭代。因此您必須在調用此方法之前保存列表並對該列表進行更改 –

回答

0

如果我理解你的目標,你希望有一個客戶列表的副本,並且每個編輯都將在同一個唯一列表中進行。就像現在一樣,每次調用GetAllClients時,都會重新創建列表,因此其他代碼所做的每個更改都會丟失。

您需要使用列表的靜態初始變量。 當有人撥打GetAllClients時,請檢查您是否已初始化列表。如果是,則返回初始化列表,如果不是,則創建列表的唯一實例並返回。

private static List<Client> _currentList = null; 
public static List<Client> GetAllClients() 
{ 
    if(_currentList == null) 
     _currentList = new List<Client> 
     { 
      new Client(e: 1, d: 1998, a: "Tom Johnson", b: "+32273", c: "Honda Civic"), 
      new Client("sarah jackson", "88777793483254459", "subaru Forester", 2005, 2), 
      new Client("jack thompson", "+37083227359", "audi 100", 1992), 
      new Client("tomas jonauskas", "+37183227359", "tesla model s", 2014, 3), 
      new Client("egle tomiene", "+00483227359", "volkswagen golf", 2010), 
      new Client("jonas petrauskas", "8482359", "peugeot 206", 2000, 2) 

     }; 
    return _currentList; 
} 

現在,如果一些代碼改變,改變是由GetAllClients返回相同的參考上榜,從而GetAllClients每次調用接收相同的修改後的副本。

請記住,這不是線程安全的。

隨着這一變化,你也可以保留現有的代碼,因爲到GetAllClients重複調用將得到總是相同的列表改變與否,但是,當然,這是一個時間到時間可持續調用GetAllClients當你在做一個廢你的代碼。只需調用它一次,將結果存儲在一個臨時變量中,然後使用引用存儲在靜態變量中的相同列表的臨時變量來完成您的工作。

public static void ValidatePhone() 
{ 
    List<Clients> clients = Program.GetAllClients(); 
    Regex regex = new Regex(@"Someregex"); 
    for (int i = 0; i < clients.Count; i++) 
    { 
     if (!regex.IsMatch(clients[i].Phone))    
      clients[i].Phone = "[Invalid phone number]"; 
     } 
    } 
} 
1

你得到每次調用GetAllClients,因爲你是用相同的Client錢回來了一個新的列表時,相同的列表。您的ValidatePhone方法正確更改列表,但不是已保存。你正在製作一個新的清單(Program.GetAllClients),然後讓它一個人待垃圾收集。要在稍後訪問它,您需要引用該對象(使用變量)。您可以按如下修改方法:

internal class Regexes 
{ 
    public static void ValidatePhone() 
    { 
     List<Client> clientList = Program.GetAllClients(); 
     Regex regex = new Regex(@"Someregex"); 
     for (int i = 0; i < clientList.Count; i++) 
     { 
      if (!regex.IsMatch(clientList[i].Phone)) 

       clientList[i].Phone = "[Netinkama ivestis]"; 
      } 
     } 

     //Console.WriteLine(clientList[1].Phone); 
    } 
} 

你引用你的「生成列表」與變量clientList,您可以訪問它,即使它改變這種方式。您不必每次都調用GetAllClients方法。

0

你這樣做每次:

Program.GetAllClients()[i].Phone = "[Invalid phone number]"; 

您創建一個全新列表,在其中修改值,然後不要用它做任何事情。 if塊一旦完成,這個新列表就完全消失。

獲取列表一次並將其存儲在一個變量:

var clients = Program.GetAllClients(); 

然後修改名單:

for (int i = 0; i < clients.Count; i++) 
{ 
    if (!regex.IsMatch(clients[i].Phone)) 
     clients[i].Phone = "[Netinkama ivestis]"; 
    } 
} 

之後,任何你想要的clients做的是最多給你。顯示它,保存它,別的東西等等。但問題是你需要在變量中存儲一個值,以便在稍後使用該值。