私有列表返回新列表,如果为null

时间:2017-02-12 00:40:49

标签: c# list

我有一类对象我正在尝试编写一个返回这些对象列表的方法。该类具有以下属性

private string make { get; set; }
private List<string> colours { get; set;}
private List<string> trims { get; set; }

以下是我用来设置汽车列表的方法

public static List<Car> getCarLot()
    {
        List<Car> carLot = new List<Car>();
        List<string> makeList = getMakes(); // returns a list of strings
        List<string> trimList = getTrims(); // returns a list of strings
        List<string> colorList = getColors(); // returns a list of strings

        foreach (string m in makeList)
        {
            Car car = new Car();
            car.colours = new List<string>(); // Want to remove this
            car.trims = new List<string>();
            car.make = m;
            foreach (string c in colorList)
                car.colours.Add(c);

            foreach (string t in trimList)
                car.trims.Add(t);

            carLot.Add(car);
        }

        return carLot;
    }

如何设置它以便每次创建对象时都不必将颜色和修剪设置为新的字符串列表

3 个答案:

答案 0 :(得分:1)

Car class:

的构造函数中初始化属性
public Car()
{
    colours = new List<string>();
    trims = new List<string>();
}

或者您可以使用属性初始值设定项(C#6或更高版本)

private List<string> colours { get; set; } = new List<string>();
private List<string> trims { get; set; } = new List<string>();

请记住,在C#中,我们使用PascalCase作为属性和方法名称。所有类属性都是私有的,这很奇怪。我相信这是你问题上的错字。通常属性是公开的。

最后一点 - 如果您将使用LINQ,您可以大量简化getCarLot方法(在这种情况下甚至不需要属性初始化):

public static List<Car> getCarLot()
{
    var trimList = getTrims();
    var colorList = getColors();

    var carLot = from m in getMakes()
                 select new Car {
                    colours = colorList.ToList(),
                    trims = trimList.ToList(),
                    make = m
                 };

    return carLot.ToList();
}

答案 1 :(得分:0)

您可以在班级的构造函数中执行此操作:

public class Car
{
    private string make { get; set; }
    private List<string> colours { get; set;}
    private List<string> trims { get; set; }

    public Car()
    {
        colours = new List<string>();
        trims = new List<string>();
    }
}

或者,如果您使用的是C#6(即Visual Studio 2015),则可以直接初始化属性:

public class Car
{
    private string make { get; set; }
    private List<string> colours { get; set;} = new List<string>();
    private List<string> trims { get; set; } = new List<string>();
}

此外,您可以显着简化代码,而无需更改您的课程:

public static List<Car> getCarLot()
{
    return makeList.Select(m => new Car
    {
        make = m,
        colours = colourList.ToList(),
        trims = trimList.ToList()
    });
}

答案 2 :(得分:0)

由于您使用的是自动属性,因此您有以下几种选择:

  • 在C#6中,您可以使用属性初始值设定项
  • 在C#6之前,您需要在构造函数中设置属性
  • 您可以将列表构建与填充结合起来

我会使用第三个选项,如下所示:

car.colours = colorList.ToList();
car.trims = trimList.ToList();

这使得foreach循环和构造函数调用都不必要,因为ToList()构造并在一次调用中返回一个副本。