用c#中的列表初始化元素

Bat*_*tle 8 c# collection-initializer

我正在考虑数组和列表,并想知道类是否以及如何使实现可以像它们一样进行初始化.我们以此课程为基础:

class TestClass
{
    private List<int> Numbers = new List<int> ();

    // Insert code here
}
Run Code Online (Sandbox Code Playgroud)

我希望能够做的是获取给定的值并在内部填充我的列表.

TestClass test = new TestClass () { 2, 4, 7, 10 };
Run Code Online (Sandbox Code Playgroud)

通常可能是这样的:

List<int> test = new List<int> () { 2, 4, 7, 10 };
Run Code Online (Sandbox Code Playgroud)

但我想将它用于我自己的自定义类.下一个问题是可选的,如果对此语法可以做同样的事情:

TestClass test = { 2, 4, 7, 10 };
Run Code Online (Sandbox Code Playgroud)

我认为不太可能.请注意,这些与此不同:

Cat cat = new Cat() { Name = "Sylvester", Age=8 };
Run Code Online (Sandbox Code Playgroud)

这些是内部字段和属性的直接和可选声明.

有关详细信息,另请参阅MSDN.

lap*_*tou 9

如前所述这里,收集initialisers将在实现任何类的工作IEnumerable ,并有一个Add()方法.

class TestClass : IEnumerable<int>
{
    private List<int> Numbers = new List<int> ();

    public void Add(int n)
    {
        Numbers.Add(n);
    }

    // implement IEnumerable methods down here ...

    public IEnumerator<int> GetEnumerator() => Numbers.GetEnumerator();

    // etc ...
}
Run Code Online (Sandbox Code Playgroud)

请注意,如果Add()方法签名中有多个参数,则可以将它们括在花括号中以使用集合初始化语法.

class TestClass2 : IEnumerable<(int, int)>
{
    private List<int> Numbers = new List<(int, int)> ();

    public void Add(int x, int y)
    {
        Numbers.Add((x, y));
    }

    // implement IEnumerable methods down here ...

    public IEnumerator<(int, int)> GetEnumerator() => Numbers.GetEnumerator();

    // etc ...
}
Run Code Online (Sandbox Code Playgroud)

会像这样使用:

var test = new TestClass2 { {2, 3}, {4, 5} };
Run Code Online (Sandbox Code Playgroud)


Pat*_*man 8

您只需要一种Add方法来完成这项工作并实现IEnumerable接口:

class TestClass : IEnumerable<int>
{
    private List<int> Numbers = new List<int> ();

    public void Add(int n)
    {
        Numbers.Add(n);
    }

    public IEnumerator<int> GetEnumerator()
    {
        return Numbers.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return this.GetEnumerator();
    }
}
Run Code Online (Sandbox Code Playgroud)

编译器将识别集合初始化程序语法,并将尝试查找匹配Add方法.