4

例: カスタム コレクション クラスのAddメソッドをICollection使用してメソッド チェーンと流暢な言語を実装したいので、これを実行できます。

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

いくつかのオプションを考えることができますが、それらは面倒で、ICollection を別のインターフェイスにラップするなどの作業が必要です。

4

6 に答える 6

11

流暢な方がいいですが、私は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>

于 2009-08-29T07:41:36.313 に答える
5

また、任意で使用できる拡張メソッドを使用しICollection<T>て、独自のコレクション クラスを作成する手間を省くこともできます。

public static ICollection<T> ChainAdd<T>(this ICollection<T> collection, T item)
{
  collection.Add(item);
  return collection;
}
于 2009-08-28T22:51:35.663 に答える
3

Add から void を返す必要があるのは、それが ICollection で設定されている方法だからです。これにより、チェーン化された Add メソッドが 1 つのパラメーターのみを使用することは除外されると思います。

あなたが望むものではありませんが、カスタムコレクションタイプにこのようなものを追加できます.

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

次に、次のことができます。

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

それが役立つことを願って、

ダン

于 2009-08-28T22:42:12.157 に答える
2

別のオプションは、C# コレクション初期化子を使用することです。

var list = new YourList<String>()
    {
         "Hello",
         "World",
         "etc..."
    };
于 2009-08-28T22:49:20.113 に答える
0

カスタム コレクション クラスで 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!");
于 2009-08-28T22:47:02.957 に答える
0

悪気はありませんが、VB.NET の方がいいかもしれません。

C# よりも「自然言語」プログラミングに役立ちます。

VB.NET では、次のことができる "with" コンストラクトがあります。

With myCollection
    .Add("Hello")
    .Add("There")
    .Add("My")
    .Add("Name")
    .Add("Is")
    .Add("Silky")
    .Sort()
End With
于 2009-08-29T08:08:54.420 に答える