2012-01-01 76 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]); 
}