【问题标题】:For Each Element in Two Lists对于两个列表中的每个元素
【发布时间】:2012-12-28 17:40:36
【问题描述】:

这是我的代码:

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 语句中迭代两个列表?

【问题讨论】:

  • 我假设您打算在第二个 foreach 中迭代 l2

标签: c# .net arrays list foreach


【解决方案1】:

可能是这样的:

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

联合删除所有重复项。 Concat() 方法没有。因此,Union 可能更可取。这取决于列表的组成。

【讨论】:

  • 请注意,Union 将删除重复项,因此在功能上不等同于 OP 中的代码。
【解决方案2】:

你可以使用 Concat() 函数:

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

请注意,重新分配基于 Enumerable 的循环的计数器变量可能会导致与更改底层 IEnumerable 相关的异常。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 此示例代码不需要大括号;单线循环体。当然,它的功能完全相同,并且 OP 拥有它们,所以...
    • @KeithS 1) 我认为没有理由删除它们。如果 OP 希望他们在那里,那很好。 2) 他为item 赋值的事实意味着他将使用它,这意味着这里可能没有显示更多的代码行(这也解释了组合两个foreach 循环的动机)。 3) 许多人喜欢在这种情况下使用大括号,即使只有一个语句;这是个人喜好问题。
    猜你喜欢
    • 2014-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-08
    • 1970-01-01
    • 2021-12-27
    相关资源
    最近更新 更多