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");
}
}
+1賢い... – SLaks