代码之家  ›  专栏  ›  技术社区  ›  Brent Arias

如何返回空的ValueCollection

  •  1
  • Brent Arias  · 技术社区  · 14 年前

    我有一本字典,我想把它的值返回给这样的调用者:

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

    不幸的是,空的可枚举类型与声明的返回类型不兼容。是否有其他的BCL设施?

    P.S.不,将三元的两个目标 (ICollection<Event>)

    4 回复  |  直到 14 年前
        1
  •  4
  •   Greg    14 年前

    因为数组实现 IList<T> 依次延伸 ICollection<T> ,可以为空集合使用空数组。

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

    编辑:
    正如其他人指出的,你也可以回来 new List<Event>() . 区别在于:

    • new Event[0] 是只读的,调用方 不能 向其中添加元素(如果尝试,将引发异常)
    • 新列表<事件>() 是可变的,呼叫者 可以 向其中添加元素(尽管每个调用者都有自己的列表,所以其他调用者看不到更改)
        2
  •  1
  •   Matthew Manela    14 年前

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

    public ICollection<Event> GetSubscriptions()
    {
        return isLockDown ? Enumerable.Empty<Event>.ToList() : subscriptionForwards.Values;
    }
    
        3
  •  1
  •   Ivan Ferić    14 年前

    你可以用这个:

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

    您需要添加此引用才能使其工作:

    using System.Collections.ObjectModel;
    
        4
  •  1
  •   Rodney S. Foley    14 年前

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

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