有一个很好的简单&优雅的方式使ICollection在C#中更流畅?

时间:2009-08-28 22:25:43

标签: c# fluent method-chaining icollection

示例:我希望使用Add自定义集合类的ICollection方法来实现方法链接和流利语言,以便我可以这样做:

randomObject.Add("I").Add("Can").Add("Chain").Add("This").

我可以想到一些选项,但它们很混乱,并涉及将ICollection包装在另一个界面中等等。

6 个答案:

答案 0 :(得分:11)

虽然流利很好,但我更感兴趣的是添加AddRange(或两个):

public static void AddRange<T>(this ICollection<T> collection,
    params T[] items)
{
    if(collection == null) throw new ArgumentNullException("collection");
    if(items == null) throw new ArgumentNullException("items");
    for(int i = 0 ; i < items.Length; i++) {
        collection.Add(items[i]);
    }
}
public static void AddRange<T>(this ICollection<T> collection,
    IEnumerable<T> items)
{
    if (collection == null) throw new ArgumentNullException("collection");
    if (items == null) throw new ArgumentNullException("items");
    foreach(T item in items) {
        collection.Add(item);
    }
}

params T[]方法允许AddRange(1,2,3,4,5)等,IEnumerable<T>允许使用LINQ查询等内容。

如果您想使用流畅的API,您还可以通过适当使用通用约束,在C#3.0中将Append编写为保留原始列表类型的扩展方法:< / p>

    public static TList Append<TList, TValue>(
        this TList list, TValue item) where TList : ICollection<TValue>
    {
        if(list == null) throw new ArgumentNullException("list");
        list.Add(item);
        return list;
    }
    ...
    List<int> list = new List<int>().Append(1).Append(2).Append(3);

(注意它会返回List<int>

答案 1 :(得分:5)

您还可以使用可与任何ICollection<T>一起使用的扩展方法,并使您免于编写自己的集合类:

public static ICollection<T> ChainAdd<T>(this ICollection<T> collection, T item)
{
  collection.Add(item);
  return collection;
}

答案 2 :(得分:3)

您需要从Add返回void,因为它是在ICollection中设置的方式。我认为这排除了链接的Add方法只需要一个参数。

不完全是您想要的,但您可以将这样的内容添加到自定义集合类型中。

public CustomCollectionType Append(string toAdd)
{
  this.Add(string toAdd);
  return this;
}

然后你可以这样做:

customCollection.Append("This").Append("Does").Append("Chain");

希望有所帮助,

答案 3 :(得分:2)

另一个选择是使用C#集合初始值设定项:

var list = new YourList<String>()
    {
         "Hello",
         "World",
         "etc..."
    };

答案 4 :(得分:0)

您可以在自定义集合类中隐藏ICollection.Add方法并将其返回。

public class MyList<T>:List<T>
{
  public new MyList<T> Add(T item)
  {
     (this as ICollection<T>).Add(item);
     return this;
  }
}

然后你可以添加链接添加调用的项目:

MyList<string> strList = new MyList<string>();
strList.Add("Hello").Add(" ").Add("World!");

答案 5 :(得分:0)

没有冒犯,但也许你更喜欢VB.NET

它比C#更有利于'自然语言'编程。

在VB.NET中,你可以使用“with”结构:

With myCollection
    .Add("Hello")
    .Add("There")
    .Add("My")
    .Add("Name")
    .Add("Is")
    .Add("Silky")
    .Sort()
End With