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]";
}
}
}
}
很抱歉问这样一个新手问题。
答案 0 :(得分: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
方法。
答案 1 :(得分: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
的重复调用将始终收到相同的列表更改,但当然,连续调用{{是浪费时间1}}和你的代码一样。只需调用一次,将结果存储在临时变量中,然后使用引用静态变量中存储的相同列表的临时变量进行工作。
GetAllClients
答案 2 :(得分: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
做什么都取决于你。显示,保存,其他等等。但关键是你需要在变量中存储一个值,以便以后使用该值。