示例:我希望使用Add
自定义集合类的ICollection
方法来实现方法链接和流利语言,以便我可以这样做:
randomObject.Add("I").Add("Can").Add("Chain").Add("This").
我可以想到一些选项,但它们很混乱,并涉及将ICollection包装在另一个界面中等等。
答案 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