C# 对象初始化类似于列表<&燃气轮机;语法

C# 对象初始化类似于列表<&燃气轮机;语法,c#,collections,collection-initializer,C#,Collections,Collection Initializer,如何定义类,使其可以像List一样初始化: 如果将MyClass定义为学生集合: public class MyClass : List<Student> { } var aClass = new MyClass{ new Student(), new Student()//... } 您选择哪一个真正取决于您对类的建模方式。我没有看到任何人建议泛型实现,所以就在这里 class Class<T> : IEnumerable { private L

如何定义类,使其可以像
List
一样初始化:


如果将
MyClass
定义为学生集合:

public class MyClass : List<Student>
{
}

var aClass = new MyClass{  new Student(), new Student()//... }

您选择哪一个真正取决于您对类的建模方式。

我没有看到任何人建议泛型实现,所以就在这里

    class Class<T>  : IEnumerable
{
    private List<T> list;
    public Class()
    {
        list = new List<T>();
    }

    public void Add(T d)
    {
        list.Add(d);
    }

    public IEnumerator GetEnumerator()
    {
        return list.GetEnumerator();
    }
}
class类:IEnumerable
{
私人名单;
公共类()
{
列表=新列表();
}
公共无效添加(TD)
{
列表.添加(d);
}
公共IEnumerator GetEnumerator()
{
返回list.GetEnumerator();
}
}
和使用:

Class<int> s = new Class<int>() {1,2,3,4};
Class s=newclass(){1,2,3,4};
通常,为了允许直接在
类上使用语法,它将实现一个集合接口,例如
ICollection
或类似的接口(比如通过继承
集合

但从技术上讲,它只需要实现非泛型的
IEnumerable
接口,并具有兼容的
Add
方法

所以这就足够了:

using System.Collections;

public class Class : IEnumerable
{
    // This method needn't implement any collection-interface method.
    public void Add(Student student) { ... }  

    IEnumerator IEnumerable.GetEnumerator() { ... }
}
用法:

Class aClass = new Class { new Student(), new Student()  };
正如您所料,编译器生成的代码类似于:

Class temp = new Class();
temp.Add(new Student());
temp.Add(new Student());
Class aClass = temp;

有关更多信息,请参阅的“7.6.10.3集合初始值设定项”部分。

您的类是否继承自IList?但ICollection和IEnumarable都没有void Add()方法,只有IList有。这是否意味着我需要实现IList(这是更好的实践,尽管您的示例运行良好)?
ICollection
确实有一个方法,尽管编译器绑定的方法不必来自该接口(如示例所示)。是否实现IList取决于集合是否必须支持按索引快速访问。
using System.Collections;

public class Class : IEnumerable
{
    // This method needn't implement any collection-interface method.
    public void Add(Student student) { ... }  

    IEnumerator IEnumerable.GetEnumerator() { ... }
}
Class aClass = new Class { new Student(), new Student()  };
Class temp = new Class();
temp.Add(new Student());
temp.Add(new Student());
Class aClass = temp;