2012-01-05 5 views
0

アレイ内のすべてのオブジェクトの値を変更するために使用できる1つのライナーはありますか?.NETの配列内のすべてのオブジェクトの値を変更するためのワンライナーはありますか?

例えば、私は、コントロールの[空]の配列を有する:

Dim myArr(9) As Control 

制御オブジェクト参照のタイプであるので、私はそれをインスタンス化するまで、私は、配列の各要素を使用することはできません。

myArr(0) = New Control() 

私は必要なアイテム数を知っていて、すべてのオブジェクトをインスタンス化する必要があることを知っています。したがって、素早くワンライナーを使用して配列のすべてのアイテムをインスタンス化する方法はありますか?今、私はこれをやっていますが、それは問題ありませんが、ライナーが1つあればいいのです。

For i As Int32 = 0 To myArr.Length - 1 
    myArr(i) = New Control() 
Next 
同じ線に沿って

、私は整数の配列を持っている場合、どのように私はワンライナーのすべての値を変更できますか?たとえば、各値に2を掛けたいとします。

私はRubyの.map!関数に没頭しています。そして、.NETでこれと同じように何かをしたいと思っています。

答えて

3

あなたは、LINQを使用することができます - 私はこのようなコードを見てきました:

var array = Enumerable.Range(0, size).Select(_ => new Control()).ToArray(); 

私は、オフ手同等のVBコードのわからないんだけど、私は、必要に応じて他の誰かがそれを供給することができると確信してい - あなたのコードは ".NET"のみを指定しています:)

個人的に私は明示的にしていますが、それはもっと効率的です。

あなたは常にもちろん、これを行うには、独自のメソッドを作成することができます。そして、

public static T[] PopulateArray<T>(Func<T> initializer, int size) 
{ 
    T[] ret = new T[size]; 
    for (int i = 0; i < size; i++) 
    { 
     ret[i] = initializer(); 
    } 
} 

var array = PopulateArray(() => new Control(), 10); 
+0

VB.NETにはほとんど違いがありません。Dim配列= Enumerable.Range(0、size).Select(関数(i)新しいコントロール).ToArray() –

1

を、私は自分自身のコレクションを更新する機能を提供するためにアップデート()拡張メソッドを使用します私はLINQクエリを介して取得します。

public static class LinqExtensions 
{ 
    public delegate void Func<Argument>(Argument item); 
    public static bool Update<SourceType>(this IEnumerable<SourceType> source, Func<SourceType> updater) 
    { 
     if (null == source) 
      throw new ArgumentException("Update extension method was given null source."); 
     if (null == updater) 
      throw new ArgumentException("Update extension method was given null updater."); 

     foreach (SourceType item in source) 
      updater(item); 

     return true; 
    } 
} 

そこから、更新されるすべてのアイテムに適用できる関数を書きます。これはルーチンのような単純な "マップ"です。私はこれを例えばWinFormsコントロールで使用しました。

関連する問題