【问题标题】:How to rewrite this foreach looping using linq?如何使用 linq 重写这个 foreach 循环?
【发布时间】:2010-10-16 04:34:57
【问题描述】:

假设我有两个类,Customer 和 Order,其中一个 Customer 可以关联一个或多个 Orders。

class Customer
{
  Order[] Orders;
}

class Order
{
  int OrderId;
}

如果对于任何给定的客户,我想找到所有相关的 OrderId,有没有一种简单的方法可以使用 linq 来做到这一点?与以下 foreach 解决方案给出相同结果的东西:

List<int> allOrderIds = new List<int>();
foreach (Order thisOrder in thisCustomer)
{
   allOrderIds.Add(thisOrder.OrderId);
}

TIA。

【问题讨论】:

    标签: c# linq foreach


    【解决方案1】:
    var allOrderIds = thisCustomer.Orders.Select(o => o.OrderId).ToList();
    

    【讨论】:

    • 其实是的,这是更好的解决方案。 +1
    【解决方案2】:

    您可以使用许多人创建的扩展方法:

    public static void ForEach<T>(this IEnumerable<T> enumeration, Action<T> action)
    {
        foreach(T item in enumeration)
        {
            action(item);
        }
    }
    

    并像这样使用它:

    thisCustomer.Orders.ForEach(c => allOrderIds.Add(o.OrderId));
    

    【讨论】:

    • BTW - @mquander 的解决方案更好,但我建议您创建上述扩展方法来添加您的“LINQ Toolbelt”。它会派上用场的。
    • 另请参阅 Lippert 的 cmets,了解这是否是一个好方法...blogs.msdn.com/b/ericlippert/archive/2009/05/18/…
    • 很有趣,但我不同意他的观点(在这种情况下)。是的 - 它的可读性较差,我不会为复杂的操作做它(我主要将它用于循环测试断言)。但是如果你发现它不可读,很可能你会发现所有的 lambda 表达式都不可读。我不明白为什么它是为List&lt;T&gt; 而不是IEnumerable&lt;T&gt; 实现的。
    • 他的大部分论点不是关于可读性,而是该方法将用于创建与功能性做事方式背道而驰的副作用。
    • @FinnNk - 是的,他至少提到了 3 次“副作用”,但从未明确说明它们是什么。我一般都想知道。当然调试起来更难,但我不认为这是“副作用”。编程中的一个副作用是当某些事情导致意外行为时。 ForEach 扩展是常规 foreach 循环的语法糖。我错过了什么?
    【解决方案3】:

    使用选择方法。如果您想对订单执行大量 linq 语句,您还应该将订单保留为列表。

    thisCustomer.Orders.ToList().Select(o => o.OrderId).ToList();
    

    【讨论】:

      猜你喜欢
      • 2020-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-16
      • 1970-01-01
      • 2014-10-23
      • 2012-05-01
      相关资源
      最近更新 更多