2012-01-01 32 views
4

我目前有:C# - 高級的foreach語句?

string settings = "setting1:value1;setting2:value2"; 
string[] pair; 
foreach(string setting in settings.Split(';')) 
{ 
    pair = setting.Split(':'); 
    MessageBox.Show(pair[0] + ":" + pair[1]); 
} 

我會的東西線沿線的更多:

string settings = "setting1:value1;setting2:value2"; 
foreach (string[] pair in string setting.Split(':') in settings.Split(';')) 
{ 
    MessageBox.Show(pair[0] + ":" + pair[1]); 
} 

兩個in關鍵字似乎有點可笑,但我認爲這樣的事情是可能的,很容易,我只是不知道如何。

那麼,有可能嗎?

+0

無論如何,第二種形式的可讀性要差得多,部分原因是每個「設置」只有一對「對」。你現在的代碼很好。 :) – James 2012-01-01 23:05:44

+0

我的LINQ-fu有點生疏,但我確實相信你想使用'SelectMany'來完成這個任務。 – 2012-01-01 23:06:12

+0

爲了保存1行代碼? – craig1231 2012-01-01 23:07:25

回答

8

我不知道這是更具可讀性,但你問它,我認爲它看起來很酷;-)

string settings = "setting1:value1;setting2:value2"; 
foreach(var pair in settings.Split(';').Select(str => str.Split(':'))) 
{ 
    MessageBox.Show(pair[0] + ":" + pair[1]); 
} 

(我還沒有編譯它,所以我對不起,如果有語法錯誤)

+1

+1,以確認它不一定更具可讀性,並且因爲LINQ很酷。 – James 2012-01-01 23:09:09

+0

謝謝,在打開這個問題之後,我也做了一點研究,找到了lambda,你用過。即使在閱讀了一些文章並查看代碼示例之後,我仍然有點困惑,關於它是如何工作的。 – mowwwalker 2012-01-01 23:11:10

+0

@Walkerneo它所做的只是在集合的每個成員上運行一個匿名方法。該方法獲取一個字符串作爲參數,將其拆分並返回一個集合。 lambda表達式相當於一個方法,它的主體是{{return param.Split(':'); }'。 'Select'方法確保爲集合的每個成員運行lambda,並返回一個'IEnumerable <>'。 – 2012-01-01 23:17:02

0
foreach (string settingstr in settings.Split(';')) 
{ 
    string[] setval = settingstr.Split(':'); 
    string setting = setval[0]; 
    string val = setval[1]; 
} 
+5

難道Walkerneo在第一個例子中就不是那麼簡單嗎? – 2012-01-01 23:05:16

1
foreach (string[] pair in settings.Split(';').Select(setting => setting.Split(':'))) 
{ 
    MessageBox.Show(pair[0] + ":" + pair[1]); 
} 
7

作爲替代其他公佈答案,你也可以使用LINQ語法:

string settings = "setting1:value1;setting2:value2"; 
foreach(string[] pair in 
    from setting in settings.Split(';') 
    select setting.Split(':')) 
{ 
    MessageBox.Show(pair[0] + ":" + pair[1]); 
}