假设我有一个带有构造函数的类,该构造函数用两个条目填充内部列表:
class MyClass
{
IList<int> someList;
public MyClass()
{
someList = new List<int>();
someList.Add(2);
someList.Add(4);
... // do some other stuff
}
}
现在假设我有几个构造函数,它们都与内部列表相同(但在其他方面有所不同)。
我想知道我是否可以将列表的生成和填充直接外包给该字段,如下所示:
class MyClass
{
IList<int> someList = new List<int>(); someList.Add(2); someList.Add(4);
// Does not compile.
public MyClass()
{
... // do some other stuff
}
}
是否可以在字段定义中调用多个命令,如果是,可以如何调用?
答案 0 :(得分:1)
您可以像这样预先实例化IList
,并在每次访问索引器时添加您的值:
IList<int> someList = new List<int>() { 2, 4 };
这将是在使用构造函数之前进行的初始化。
正如评论中提到的OP,对于LinkedList<T>()
,您必须使用带有IEnumarable
的构造函数(在我的示例中为数组)。
LinkedList<int> myList1 = new LinkedList<int>(new int[] {2,3,4});
在阅读完您的上一条评论后,您在实例化过程中正在寻找Fluent Interfaces
。这是一种将函数链接在一起的方法,看起来像这样:
Customer c1 = new Customer()
.FirstName("matt")
.LastName("lastname")
.Sex("male")
.Address("austria");
默认情况下,Collection Classes中不提供此功能。您必须为此实现自己的 IList<T>
版本。
Lambda Expression是实现此目的的一种方式,就像您的更新显示...
答案 1 :(得分:1)
知道了:
IList<int> someList = new Func<List<int>>(() => { IList<int> l = new List<int>(); l.Add(2); l.Add(4); return l; })();
说明:
() => { IList<int> l = new List<int>(); l.Add(2); l.Add(4); return l; }
是一个不带参数且返回IList<int>
的函数,因此它是Func<IList<int>>
。
虽然编译器知道这一点,但我似乎必须通过
明确说明这一事实new Func<IList<int>>(...)
以后可以调用它。通过在()
后放置两个括号Func
来完成调用。
或者以更易读的方式编写它(然后我甚至不需要new
关键字,而是必须使Func
静态化:
static Func<IList<int>> foo = () => { IList<int> l = new List<int>(); l.Add(2); l.Add(4); return l; };
IList<int> someList = foo();