在List <t> </t> </datetime>中添加List <datetime>值

时间:2014-07-04 03:35:45

标签: c# list datetime

这可能是一种棘手的行为。基本上我有一个看起来像这样的课程:

class Timer
{
    public string boss { get; set; }
    public List<DateTime> spawnTimes { get; set; }
    public TimeSpan Runtime { get; set; }
    public BossPriority priority { get; set; }

}

如您所见,我想在我的对象中添加DateTimes列表。所以我创建了一个如下所示的列表:

List<Timer> bosses = new List<Timer>();

我希望我能做类似的事情,添加DateTimes:

bosses.Add(new Timer { boss = "Tequatl", priority = BossPriority.HardCore, spanTimes = {  DateTime.ParseExact("07:00 +0000", "hh:mm zzz", CultureInfo.InvariantCulture) } });

不幸的是,这给了我一个未设置为对象实例的&#34; Object引用。&#34;错误。

这样做,也不会产生任何影响:(

Timer boss = new Timer();
DateTime t1 = DateTime.ParseExact("07:00 +0000", "hh:mm zzz", CultureInfo.InvariantCulture);
DateTime t2 = DateTime.ParseExact("11:30 +0000", "hh:mm zzz", CultureInfo.InvariantCulture);
boss.spawnTimes.AddRange(new List<DateTime> { t1, t2 });

我真的在每个DateTime上都添加.Add()吗?

6 个答案:

答案 0 :(得分:5)

您的NRE是由于您未初始化Timer.spawnTimes而造成的。

如果您将类初始化为默认构造函数的一部分,则可以保存输入:

public class Timer {

    public List<DateTime> SpawnTimes { get; private set; }
    ...

    public Timer() {
        this.SpawnTimes = new List<DateTime>();
    }

}

另一种选择是让一个重载的构造函数接受params个参数:

public class Timer {

    public List<DateTime> SpawnTimes { get; private set; }
    ...

    public Timer() {
        this.SpawnTimes = new List<DateTime>();
    }

    public Timer(String boss, /*String runtime,*/ BossPriority priority, params String[] spawnTimes) : this() {

        this.Boss = boss;
//      this.Runtime = TimeSpan.Parse( runtime );
        this.Priority = priority;

        foreach(String time in spawnTimes) {

            this.SpawnTimes.Add( DateTime.ParseExact( time, "HH:mm" ) );
        }

    }
}

这在实践中使用如下:

bosses.Add( new Timer("Tequat1", BossPriority.HardCore, "07:00 +0000" ) );
bosses.Add( new Timer("Tequat2", BossPriority.Nightmare, "01:00 +0000", "01:30 +0000" ) );
bosses.Add( new Timer("Tequat3", BossPriority.UltraViolence, "12:00 +0000" ) );

另外:FxCop / StyleCop时间!

  • 类型(如类)应为PascalCase
  • 公共成员也应该是PascalCase(与他们camelCase中的Java不同)
    • e.g。 public BossPriority priority应为public BossPriority Priority
  • 不应通过可变属性公开收集成员(即使用private set而不是set(隐含公开)
  • 公众集合成员应为Collection<T>ReadOnlyCollection<T>,而非List<T>T[]

答案 1 :(得分:2)

你很亲密......你只是忘了宣布一个新的实例。

添加new[],然后将数组投射到List

bosses.Add(new Timer { boss = "Tequatl", priority = BossPriority.HardCore,
    spawnTimes = new[] { DateTime.ParseExact("07:00 +0000", "hh:mm zzz", CultureInfo.InvariantCulture) }.ToList() });

答案 2 :(得分:2)

试试这个:

spanTimes = new List<DateTime>{  DateTime.ParseExact("07:00 +0000", "hh:mm zzz", CultureInfo.InvariantCulture) }

基本上,使用List Initializer语法初始化一个包含所需值的新列表。

答案 3 :(得分:2)

bosses.Add(new Timer { boss = "Tequatl", priority = BossPriority.HardCore, spanTimes = new List<DateTime> {  DateTime.ParseExact("07:00 +0000", "hh:mm zzz", CultureInfo.InvariantCulture) } });

您必须new spawnTimes

答案 4 :(得分:1)

您必须在使用之前初始化spawnTimes集合

boss.spawnTimes = new List<DateTime>();

答案 5 :(得分:1)

您已关闭,但需要包含List实例化。尝试

bosses.Add(new Timer { boss = "Tequatl", priority = BossPriority.HardCore, spanTimes = new List<DateTime>{ DateTime.ParseExact("07:00 +0000", "hh:mm zzz", CultureInfo.InvariantCulture) } });