问题描述
|
我的课如下:
public class ABC {
public IList<TextFillerDetail> TextFillerDetails
{ get { return _textfillerDetails; } }
private List<TextFiller> _textfillerDetails = new List<TextFiller>();
}
我实例化该类并向其中添加一些TextDetails:
var ans = new ABC();
ans.TextDetails.Add(new TextDetail());
ans.TextDetails.Add(new TextDetail());
ans.TextDetails.Add(new TextDetail());
ans.TextDetails.Add(new TextDetail());
有没有一种方法可以通过向类中添加一些代码(例如,另一种构造函数)来一步完成。例如,通过传递数字5来请求添加五个元素?
var ans = new ABC(5);
解决方法
当然,您可以使用构造函数来初始化列表:
public class ABC
{
public ABC(int count)
{
if (count < 1)
{
throw new ArgumentException(\"count must be a positive number\",\"count\");
}
_textfillerDetails = Enumerable
.Range(1,count)
.Select(x => new TextDetail())
.ToList();
}
public IList<TextFillerDetail> TextFillerDetails { get { return _textfillerDetails; } }
private List<TextFiller> _textfillerDetails;
}
, 您可以将其添加为构造函数参数:
public class ABC()
{
public ABC(int count)
{
for (int i = 0; i < count; i++)
{
TextDetails.Add(new TextDetail());
}
}
// Stuff
}
, 当然:
public class ABC {
public IList<TextFillerDetail> TextFillerDetails
{ get { return _textfillerDetails; } }
public ABC(int capacity)
{
_textfillerDetails = new List<TextFiller>(capacity);
}
private List<TextFiller> _textfillerDetails;
}
, 有几种方法:
使用初始化器;它节省了一些输入:
var ans = new ABC{
new TextDetail(),new TextDetail(),}
更好的主意:使用Linq重复初始化lambda:
var ans = Enumerable.Repeat(0,5).Select(x=>new TextDetail()).ToList();
, 您可以放入一个重载的构造函数,该构造函数将要添加的项数作为参数。
但是,为什么需要这样做呢?您是否可以根据需要将8个对象添加到列表中?
, 只是为了这个任务,是的,
private List<TextFiller> _textfillerDetails = new List<TextFiller>();
public ABC(int capacity)
{
for(int index = 0; index < capacity; index ++)
_textfillerDetails.Add(new TextDetail());
}
, 您可以使用for循环或linq:
public class ABC
{
public IList<TextFillerDetail> TextFillerDetails { get; private set }
public ABC() : this(0)
{
}
public ABC(int count)
{
TextFIllerDetails = Enumerable.Range(0,count)
.Select(x => new TextFillerDetail())
.ToList();
}
}
, 考虑同时使用
IEnumerable或ICollection或IQueryable对象。
雷·阿克坎森