例: カスタム コレクション クラスのAdd
メソッドをICollection
使用してメソッド チェーンと流暢な言語を実装したいので、これを実行できます。
randomObject.Add("I").Add("Can").Add("Chain").Add("This").
いくつかのオプションを考えることができますが、それらは面倒で、ICollection を別のインターフェイスにラップするなどの作業が必要です。
例: カスタム コレクション クラスのAdd
メソッドをICollection
使用してメソッド チェーンと流暢な言語を実装したいので、これを実行できます。
randomObject.Add("I").Add("Can").Add("Chain").Add("This").
いくつかのオプションを考えることができますが、それらは面倒で、ICollection を別のインターフェイスにラップするなどの作業が必要です。
流暢な方がいいですが、私はAddRange
(または2つ)を追加することにもっと興味があります:
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)
etcがIEnumerable<T>
許可され、LINQクエリなどで使用できるようになります。
流暢なAPIを使用する場合は、ジェネリック制約を適切に使用することで、元のリストタイプAppend
を保持する拡張メソッドとしてC#3.0で作成することもできます。
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>
)
また、任意で使用できる拡張メソッドを使用しICollection<T>
て、独自のコレクション クラスを作成する手間を省くこともできます。
public static ICollection<T> ChainAdd<T>(this ICollection<T> collection, T item)
{
collection.Add(item);
return collection;
}
Add から void を返す必要があるのは、それが ICollection で設定されている方法だからです。これにより、チェーン化された Add メソッドが 1 つのパラメーターのみを使用することは除外されると思います。
あなたが望むものではありませんが、カスタムコレクションタイプにこのようなものを追加できます.
public CustomCollectionType Append(string toAdd)
{
this.Add(string toAdd);
return this;
}
次に、次のことができます。
customCollection.Append("This").Append("Does").Append("Chain");
それが役立つことを願って、
ダン
別のオプションは、C# コレクション初期化子を使用することです。
var list = new YourList<String>()
{
"Hello",
"World",
"etc..."
};
カスタム コレクション クラスで ICollection.Add メソッドを非表示にして、これを返すことができます。
public class MyList<T>:List<T>
{
public new MyList<T> Add(T item)
{
(this as ICollection<T>).Add(item);
return this;
}
}
次に、チェーンされた Add 呼び出しで項目を追加できます。
MyList<string> strList = new MyList<string>();
strList.Add("Hello").Add(" ").Add("World!");
悪気はありませんが、VB.NET の方がいいかもしれません。
C# よりも「自然言語」プログラミングに役立ちます。
VB.NET では、次のことができる "with" コンストラクトがあります。
With myCollection
.Add("Hello")
.Add("There")
.Add("My")
.Add("Name")
.Add("Is")
.Add("Silky")
.Sort()
End With