.net LinkedList(T)添加方法

.net LinkedList(T)添加方法,.net,interface,explicit-interface,.net,Interface,Explicit Interface,接口中的Add方法已由类显式实现。相反,此集合具有AddFirst和AddLast方法。显式实现的方法映射到AddLast方法。这有一些缺点,但毫无益处。两个主要缺点是: 不能在LinkedList上使用集合初始化,因为它需要Add方法。 如果您在方法中使用了ListT,并希望将其更改为使用LinkedListT,则必须将所有调用更新为Add,以改为call AddLast。 我的想法是,您永远不应该显式地实现接口成员,除非当您知道具体类型时它们毫无意义。例如,如果要实现只读ICollectio

接口中的Add方法已由类显式实现。相反,此集合具有AddFirst和AddLast方法。显式实现的方法映射到AddLast方法。这有一些缺点,但毫无益处。两个主要缺点是:

不能在LinkedList上使用集合初始化,因为它需要Add方法。 如果您在方法中使用了ListT,并希望将其更改为使用LinkedListT,则必须将所有调用更新为Add,以改为call AddLast。 我的想法是,您永远不应该显式地实现接口成员,除非当您知道具体类型时它们毫无意义。例如,如果要实现只读ICollectionT,则应该显式实现Add方法并有效隐藏该方法

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

作为旁注:要解决第2个问题,您可以为LinkedListT类创建一个扩展方法Add。

Add方法可能不明确,因此我满足于显式实现

队列[]和堆栈[]具有类似的行为

对于其他非集合成员-和如何

如果问题在这两者之间转移,则始终可以在IEnumerable上编写ToLinkedList扩展方法

或者-一个AddRange扩展方法有很长的路要走

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);
    }
}
编辑如果希望将fluent 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;
}
Add方法是不明确的,所以我满足于显式实现

队列[]和堆栈[]具有类似的行为

对于其他非集合成员-和如何

如果问题在这两者之间转移,则始终可以在IEnumerable上编写ToLinkedList扩展方法

或者-一个AddRange扩展方法有很长的路要走

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);
    }
}
编辑如果希望将fluent 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;
}

我猜你的意思是,这对开发者来说是模棱两可的?问题不在于不能添加范围,问题在于接口不同于其他ICollection,因此除非转换到接口,否则它们不可互换。这就是接口存在的主要原因。。。例如,将队列和堆栈添加到该列表中。队列和堆栈在语义上无法与简单集合进行比较。同样的事情可以用EditorBrowsableAttribute更优雅地完成。我不知道精确性和规模的显式实现,很有趣。我想你的意思是,这对开发人员来说是不明确的?问题不在于不能添加范围,问题在于接口不同于其他ICollection,因此除非转换到接口,否则它们不可互换。这就是接口存在的主要原因。。。例如,将队列和堆栈添加到该列表中。队列和堆栈在语义上无法与简单集合进行比较。同样的事情可以用EditorBrowsableAttribute更优雅地完成。有趣的是,我不知道精确性和规模的显式实现。