[英]Variable to list assignment in C#?
在PHP中,您可以編寫
$arr = array(1,2);
list($a, $b) = $arr;
基本上相當於
$a = $arr[0];
$b = $arr[1];
C#中有等效的東西嗎?
煩我,因為我經常寫這樣的東西
var split = action.Split('.');
string controllerName = split[0];
string actionName = split[1];
而split
只是一個扔掉的變量,我永遠也不會想到一個像樣的名字。 “塊”,“位”,“件”,“零件”,……毫無意義。
您可以編寫自己的方法,例如:
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];
}
我不建議這樣做,但是...您必須小心使用正確數量的參數,而且我認為沒有一種方法可以實現任意大小-C#具有“參數數組”的概念在簽名中,但我認為您無法使用“ out”參數來實現。
除了這個?
a = arr[0];
b = arr[1];
沒有。
不幸的是,這是不可能的。
為了擴展Joe的解決方案 ,輸入不必是數組。 它可以是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);
如果您需要確切數量的參數,則拋出異常而不是分配null:
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");
}
}
沒有與您的第一個示例等效的內容。
等價於您在第二個示例中編寫的內容,
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.