如何设置一个空的iCollection C#

14

我有三个集合:

private ICollection<FPTAssetClassAsset> wrassets;
private ICollection<FPTFundAsset> wrfunds;
private ICollection<FPTManagedStrategyAsset> wrstrats;

如果foreach循环返回0个对象,则集合不会被设置,因此为空。 当我将这个icollection(Union)添加到另一个icollection时,会出现“值不能为空”的错误,因为icollection为空,而不是为空列表。如何将该集合设置为空列表?

循环:

    public void GetWrapperAssets(FPT fpt)
    {
        foreach (var w in fpt.CouttsPositionSection.Wrappers
        .Union(fpt.StandAloneSection.Wrappers)
        .Union(fpt.BespokePropositionSection.Wrappers)
        .Union(fpt.NonCouttsPositionSection.Wrappers)
        )
        {
            foreach (var a in w.UnderlyingAssets.OfType<FPTManagedStrategyAsset>())
            {
                wrstrats.Add(a);
            }
            foreach (var a in w.UnderlyingAssets.OfType<FPTAssetClassAsset>())
            {
                wrassets.Add(a);
            }
            foreach (var a in w.UnderlyingAssets.OfType<FPTFundAsset>())
            {
                wrfunds.Add(a);
            }
        }
    }

1
将每个变量初始化为 = new Collection<...>() - n8wrl
3个回答

9

在foreach循环之前初始化你的集合,这样它们就始终有一个值:

private ICollection<FPTAssetClassAsset> wrassets = new Collection<FPTAssetClassAsset>();
private ICollection<FPTFundAsset> wrfunds = new Collection<FPTFundAsset>();
private ICollection<FPTManagedStrategyAsset> wrstrats = new Collection<FPTManagedStrategyAsset>();

1
谢谢,由于一个抽象类无法初始化新的Collection,因此使用List代替,并且运行得很好。 - Marc Howard

6

好的,您可以在添加之前始终检查 null。或者您可以将其转换为属性:

private ICollection<FPTAssetClassAsset> wrassets
{ 
    get { return _wrassets == null ? new List<FPTAssetClassAsset>() : _wrassets; }
}
private ICollection<FPTAssetClassAsset> _wrassets;

1
你在哪里设置_wrassets的值?由于_wrassets从未被设置,上述代码不会返回一个新的List<FBTAssetClassAsset>()吗? - O.MeeKoh

6

如果您只是想要一个在读取时不会崩溃的东西,直到您有时间将其替换为实际使用的内容,您可以使用Array.Empty<T>

private ICollection<FPTAssetClassAsset> wrassets      = Array.Empty<FPTAssetClassAsset>();
private ICollection<FPTFundAsset> wrfunds             = Array.Empty<FPTFundAsset>();
private ICollection<FPTManagedStrategyAsset> wrstrats = Array.Empty<FPTManagedStrategyAsset>();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接