添加列表<;日期时间>;列表中的值<;T>;

本文关键字:gt lt 列表 日期 添加 时间 | 更新日期: 2023-09-27 18:11:36

这可能有点狡猾。基本上,我有一个看起来像这样的类:

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) } });

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

这样做也没什么区别:(

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上都有Do.Add((吗?

添加列表<;日期时间>;列表中的值<;T>;

您的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(与Java中的camelCase不同(
    • 例如public BossPriority priority应该是public BossPriority Priority
  • 集合成员不应通过可变属性公开(即使用private set而不是set(隐含公共(
  • 公共集合成员应为Collection<T>ReadOnlyCollection<T>,而不是List<T>T[]

你很接近。。。你只是忘了声明一个新实例。

添加new[],然后将数组强制转换为List:

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

试试这个:

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

基本上,使用ListInitializer语法用您想要的值初始化一个新列表。

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

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

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

您已接近,但需要包含List实例化。尝试

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