LinkedList(T)add-method

时间:2009-02-06 09:55:03

标签: .net interface explicit-interface

来自ICollection(T)接口的Add-method已由LinkedList(T)-类显式实现。该集合改为具有AddFirst-和AddLast-方法(以及其他方法)。显式实现的方法映射到AddLast方法。这有一些缺点,恕我直言,没有任何好处。两个主要缺点是:

  1. 您不能在LinkedList(T)上使用集合初始化,因为它需要Add-method。
  2. 如果你曾经在一个方法中使用了let一个List(T)并希望将其更改为使用LinkedList(T),那么你必须更新所有对Add的调用以改为调用AddLast。
  3. 我想到的方式是你应该从不明确地实现接口成员,除非在你知道具体类型时根本没有意义。例如,如果要实现只读IC​​ollection(T),则应显式实现(并有效隐藏)Add方法。

    是否有其他明确实施的方法示例应该不在框架中?

    作为旁注:要解决2号问题,您可以为LinkedList(T)类创建扩展方法“Add”。

1 个答案:

答案 0 :(得分:4)

Add方法不明确,所以我满足于明确的实现......

Queue[<T>]Stack[<T>]有类似行为。

对于其他(非收集)好奇的显性成员 - DbParameter.PrecisionDbParameter.Scale怎么样。

重新解决两者之间的问题 - 你总是可以在ToLinkedList<T>上写一个IEnumerable<T>扩展方法。

或者 - AddRange<T>扩展方法有很长的路要走......

static void Main()
{
    var list = new LinkedList<int>();
    list.AddRange(1, 2, 3, 4, 5);
}
static void AddRange<T>(this ICollection<T> list, params T[] values)
{
    foreach (T value in values)
    {
        list.Add(value);
    }
}

EDIT )如果您希望能够将其用作单个表达式,也可以使用“流畅”API:

static void Main()
{
    var list = new LinkedList<int>().AddRange(1, 2, 3, 4, 5);
    // `list` is correctly a LinkedList<int> here
}
static TCollection AddRange<TCollection, TValue>(
    this TCollection collection, params TValue[] values)
    where TCollection : ICollection<TValue>
{
    foreach (TValue value in values)
    {
        collection.Add(value);
    }
    return collection;
}