如何编辑我的列表
本文关键字:我的 列表 编辑 何编辑 | 更新日期: 2023-09-27 18:18:12
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]";
}
}
}
}
对不起,我问了这么一个新手问题。
每次调用GetAllClients
都会得到相同的列表,因为您返回具有相同Client
s的新列表。你的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
方法。
如果我理解你的目标,你想有一个客户列表的单一副本,每个编辑将在同一个唯一的列表上。现在,每次调用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]";
}
}
}
每次你这样做:
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
做什么都取决于你。显示它,保存它,等等。但关键是您需要将值存储在变量中,以便稍后使用该值。