.net 如何返回空的ValueCollection

.net 如何返回空的ValueCollection,.net,collections,.net,Collections,我有一个字典,我想将其值返回给调用方,如下所示: public ICollection<Event> GetSubscriptions() { return isLockDown ? Enumerable.Empty<Event> : subscriptionForwards.Values; } public ICollection GetSubscriptions() { return isLockDown?可枚举。空:subscriptionForwards

我有一个字典,我想将其值返回给调用方,如下所示:

public ICollection<Event> GetSubscriptions()
{
    return isLockDown ? Enumerable.Empty<Event> : subscriptionForwards.Values;
}
public ICollection GetSubscriptions()
{
return isLockDown?可枚举。空:subscriptionForwards.Values;
}
遗憾的是,空的可枚举类型与声明的返回类型不兼容。有没有其他的BCL设施


p、 不,将三元数组的两个目标都强制转换为
(ICollection)

是不起作用的,因为数组实现了
IList
,而IList又扩展了
ICollection
,所以可以将空数组用于空集合

public ICollection<Event> GetSubscriptions()
{
    return isLockDown ? new Event[0] : subscriptionForwards.Values;
}
public ICollection GetSubscriptions()
{
return isLockDown?新事件[0]:subscriptionForwards.Values;
}
编辑:
正如其他人指出的,您还可以返回
newlist()
。区别在于:

  • 新事件[0]
    为只读,调用方无法向其添加元素(如果尝试,将引发异常)
  • new List()
    是可变的,调用方可以向其中添加元素(尽管每个调用方都有自己的列表,所以其他调用方看不到更改)

由于数组实现了
IList
,而IList又扩展了
ICollection
,因此可以将空数组用于空集合

public ICollection<Event> GetSubscriptions()
{
    return isLockDown ? new Event[0] : subscriptionForwards.Values;
}
public ICollection GetSubscriptions()
{
return isLockDown?新事件[0]:subscriptionForwards.Values;
}
编辑:
正如其他人指出的,您还可以返回
newlist()
。区别在于:

  • 新事件[0]
    为只读,调用方无法向其添加元素(如果尝试,将引发异常)
  • new List()
    是可变的,调用方可以向其中添加元素(尽管每个调用方都有自己的列表,所以其他调用方看不到更改)

如果您确实仍要使用Enumerable.Empty,则可以执行以下操作:

public ICollection<Event> GetSubscriptions()
{
    return isLockDown ? Enumerable.Empty<Event>.ToList() : subscriptionForwards.Values;
}
public ICollection GetSubscriptions()
{
return isLockDown?Enumerable.Empty.ToList():subscriptionForwards.Values;
}

如果您确实仍要使用Enumerable.Empty,则可以执行以下操作:

public ICollection<Event> GetSubscriptions()
{
    return isLockDown ? Enumerable.Empty<Event>.ToList() : subscriptionForwards.Values;
}
public ICollection GetSubscriptions()
{
return isLockDown?Enumerable.Empty.ToList():subscriptionForwards.Values;
}
您可以使用以下方法:

public ICollection<Event> GetSubscriptions()
{
    return isLockDown ? new Collection<Event>() : subscriptionForwards.Values;
}
你可以用这个:

public ICollection<Event> GetSubscriptions()
{
    return isLockDown ? new Collection<Event>() : subscriptionForwards.Values;
}

您始终可以创建自己的空集合。至少施工只发生一次

private static readonly ICollection<Event> EMPTY_EVENTS = new List<Event>();

public ICollection<Event> GetSubscriptions()
{
    return isLockDown ? EMPTY_EVENTS : subscriptionForwards.Values;
}
private static readonly ICollection EMPTY_EVENTS=new List();
公共ICollection GetSubscriptions()
{
return isLockDown?EMPTY_事件:subscriptionForwards.Values;
}

您始终可以创建自己的空集合。至少施工只发生一次

private static readonly ICollection<Event> EMPTY_EVENTS = new List<Event>();

public ICollection<Event> GetSubscriptions()
{
    return isLockDown ? EMPTY_EVENTS : subscriptionForwards.Values;
}
private static readonly ICollection EMPTY_EVENTS=new List();
公共ICollection GetSubscriptions()
{
return isLockDown?EMPTY_事件:subscriptionForwards.Values;
}

这就是我所做的(尽管我制作了一个静态只读
empty=new事件[0]
)。我会等到下周再收集更多答案,但如果没有它们,我会标记你的答案。对象实例化并没有那么昂贵。除非每秒调用此方法数百次,否则在我看来,为保存空集合而创建静态变量是过早的优化。这就是我所做的(尽管我创建了一个静态只读
empty=new事件[0]
)。我会等到下周再收集更多答案,但如果没有它们,我会标记你的答案。对象实例化并没有那么昂贵。除非此方法每秒被调用数百次,否则在我看来,为保存空集合而创建静态变量是过早的优化。为什么要将Enumerable.empty作为ICollection返回?ICollection意味着你可以用它做更多的事情,比如添加项目。我会返回一个空列表,他们可以编辑或将签名更改为IEnumerable。为什么返回一个Enumerable.empty作为ICollection?ICollection意味着你可以用它做更多的事情,比如添加项目。我会返回一个空列表,他们可以编辑或将签名更改为IEnumerable。