如何编辑我的列表

本文关键字:我的 列表 编辑 何编辑 | 更新日期: 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做什么都取决于你。显示它,保存它,等等。但关键是您需要将值存储在变量中,以便稍后使用该值。