3

我怎样才能定义类,以便它可以类似地初始化List<T>

List<int> list = new List<int>(){ //this part };

例如,这种情况:

Class aClass = new Class(){ new Student(), new Student()//... };
4

3 回答 3

6

通常,为了允许直接在 上的集合初始化器语法Class,它将实现诸如ICollection<Student>或类似的集合接口(例如通过从 继承Collection<Student>)。

但从技术上讲,它只需要实现非泛型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 集合初始值设定项”部分。

于 2011-12-26T10:52:56.070 回答
1

如果您定义MyClass为一组学生:

public class MyClass : List<Student>
{
}

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

或者,如果您的课程包含以下公共集合Student

public class MyClass
{
  public List<Student> Students { get; set;}
}

var aClass = new MyClass{ Students = new List<Student>
                                     { new Student(), new Student()//... }}

您选择哪一个实际上取决于您如何为类建模。

于 2011-12-26T10:52:34.237 回答
0

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

    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<int> s = new Class<int>() {1,2,3,4};
于 2011-12-26T10:52:40.047 回答