如何编辑我的清单?

时间:2015-10-17 18:03:55

标签: c# list generics

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]";
            }
        }
    }
}

很抱歉问这样一个新手问题。

3 个答案:

答案 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做什么都取决于你。显示,保存,其他等等。但关键是你需要在变量中存储一个值,以便以后使用该值。