簡體   English   中英

在C#中列出列表的變量?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM