2010-12-30 12 views
1

PHPでは、基本的にC#で代入する変数は?

$a = $arr[0]; 
$b = $arr[1]; 

のと同じです

$arr = array(1,2); 
list($a, $b) = $arr; 

は、C#での等価があります書くことができますか?


ただ、バグ私をそう頻繁に私は

var split = action.Split('.'); 
string controllerName = split[0]; 
string actionName = split[1]; 

そしてsplitのようなものを書くためには、私はのためのまともな名前を考えることはありませんちょうど使い捨ての変数です。 "チャンク"、 "ビット"、 "ピース"、 "パーツ"、...すべて無意味なジバリッシュ。

答えて

5

あなたが好きな、独自のメソッドを書くことができ:「

int[] arr = new[] { 1, 2 }; 

int a, b; 
Populate(arr, out a, out b); 

static void Populate<T>(T[] arr, out T t1, out T t2) 
{ 
    t1 = arr[0]; 
    t2 = arr[1]; 
} 

私は、それをお勧めしませんけれども...あなたは、パラメータの右の数を持っていることについて注意する必要があるだろう、と私はドンtは任意のサイズを行う方法があると思う - C#は署名の中で "params配列"の概念を持っていますが、私はあなたが "out"パラメータでそれを行うことはできないと思います。

+0

+1賢い... – SLaks

2

これ以外は?

a = arr[0]; 
b = arr[1]; 

1

あなたの最初の例に相当するものはありません。

1

同等のは、あなたの第二の例で書かれたものだろうが、残念ながら、これは不可能です。

2

Joe's solutionに拡張するには、入力は配列である必要はありません。 IEnumerable<T>にすることができ、データのソースを渡すことができます。そしてそれをしたら、それは拡張メソッドでなければならないように見え始めます。さらに、入力パラメータと同じ数のコレクションがコレクション内に存在すると常に仮定するのではなく、数にミスマッチを許容するのが便利な場合もあります。

public static void AssignTo<T>(this IEnumerable<T> source, out T dest1, out T dest2) 
{ 
    using (var e = source.GetEnumerator()) 
    { 
     dest1 = e.MoveNext() ? e.Current : default(T); 
     dest2 = e.MoveNext() ? e.Current : default(T); 
    } 
} 

次に、このコード:

string x, y; 
"x".Split(',').AssignTo(out x, out y); 
Console.WriteLine(x + ", " + y); 
"x,y".Split(',').AssignTo(out x, out y); 
Console.WriteLine(x + ", " + y); 
"x,y,z".Split(',').AssignTo(out x, out y); 
Console.WriteLine(x + ", " + y); 

意志出力:

 
x, 
x, y 
x, y 

なぜあなたがこれまでに渡された間違ったサイズのリストを許可したいのでしょうか?たとえば、クエリ文字列を解析しているとします。 Pythonではkey, value = query.split('=')と言いたいかもしれませんが、keyが有効なクエリであり、key=value=valueもあり、両方とも例外が発生する可能性があるため動作しません。通常、あなたは

string[] kv = query.Split('='); 
string key = kv[0]; 
string value = kv.Length > 1 ? kv[1] : null; 

を書く必要があるだろうが、代わりに、あなただけのあなたがが、引数の正確な数が必要な場合は、だけではなく、ヌルを割り当てるので例外をスロー

string key, value; 
query.Split('=').AssignTo(out key, out value); 

を書き込むことができます。

public static void AssignToExact<T>(this IEnumerable<T> source, out T dest1, out T dest2) 
{ 
    using (var e = source.GetEnumerator()) 
    { 
     if (e.MoveNext()) dest1 = e.Current; 
     else throw new ArgumentException("Only 0 of 2 arguments given", "source"); 
     if (e.MoveNext()) dest2 = e.Current; 
     else throw new ArgumentException("Only 1 of 2 arguments given", "source"); 
     if (e.MoveNext()) throw new ArgumentException("More than 2 arguments given", "source"); 
    } 
} 
+0

"out"と "params"は混在していないようです...私はこの素晴らしい、しかしまだかなりクールにするために過負荷の束を必要とするでしょう。 – mpen

+0

非常にいい実装です.10から12のオーバーロードを組み合わせて、これを合理的であるほど多く伸ばすことは大したことではありません。コピー/ペーストや、素早く汚れたコードジェネレータが必要です。おそらくあまりにも多くの、あるいは十分でない値を持つことは私にとっては恐ろしいことですが、それはあなたの必要に応じていると思います。 –

関連する問題