2013-01-14 24 views
1

每个元素这是我的代码:对于两个列表

List<string> l1 = new List<string> { "a", "b", "c" }; 
List<string> l2 = new List<string> { "x", "y", "z" }; 
foreach (var item in l1) 
{ 
    item = MyFunction(item); 
} 
foreach (var item in l1) 
{ 
    item = MyFunction(item); 
} 

有没有办法在一个单一的foreach语句来遍历两个列表?

+2

我假设你打算在第二个foreach中迭代'l2'? – Servy

回答

7

假设List对象的类型相同,您可以使用Concat

foreach (var item in l1.Concat(l2)) 
{ 
    item = MyFunction(item); 
} 
+0

此示例代码不需要大括号;单线循环体。当然它的功能和OP一样,所以... – KeithS

+1

@KeithS 1)我看不出有任何理由删除它们。如果OP希望他们在那里,那很好。 2)他将一个值赋给'item'意味着他会使用它,这意味着这里可能有更多的代码行没有显示(这也解释了组合这两个foreach循环的动机)。 3)即使只有一个陈述,许多人更喜欢在这种情况下使用大括号;这是个人偏好问题。 – Servy

4

您可以使用CONCAT()函数:

foreach(var item in l1.Concat(l2)) 
    item = MyFunction(item); 

注意,重新分配一个基于可枚举循环的计数器变量可能会导致与更改基础IEnumerable的例外。

0

也许是这样的:

var mergedList = 11.Union(l2).ToList(); 
foreach (var item in mergedList) 
{ 
    item = MyFunction(item); 
} 

联盟删除任何重复。 Concat()方法不。所以联盟可能是可取的。这取决于列表的组成。

+0

请注意,'Union'将删除重复项,因此在功能上与OP中的代码不相同。 – Servy