【问题标题】:How do you convert these nested foreach to linq你如何将这些嵌套的 foreach 转换为 linq
【发布时间】:2016-07-02 05:16:21
【问题描述】:

这是我的嵌套 foreach 查询:

foreach (Order order in xOrders)
{
    foreach (OrderItemDetail oid in order.OrderItemDetails)
    {
        db.Entry(oid).Reload();
    }

    foreach (Dispatch dispatch in order.Dispatches)
    {
        foreach (DispatchItemDetail did in dispatch.DispatchItemDetails)
        {
            db.Entry(did).Reload();
        }

        db.Entry(dispatch).Reload();
    }

    db.Entry(order).Reload();
}

现在,我想将其转换为纯 linq,因此我至少会更安全,因为 Enumeration 无法继续,因为 Collection 已更改。

我知道,如果有 1 个 foreach,我可以将其转换为 LINQ,例如:

foreach 查询:

foreach (Order order in xOrders)
{
    db.Entry(order).Reload();
}

LINQ 查询:

xOrders.ToList().ForEach(x => db.Entry(x).Reload());

但我想知道如何为嵌套 foreach 做到这一点,如第一个代码块所示......

【问题讨论】:

  • 除了不是LINQToListForEachList<T>上的一个方法。 Linq 是用于查询数据,而不是修改数据。
  • 对不起,我误解了这个概念。但是你能告诉我在这种情况下如何使用 ForEach 吗?
  • 您为什么要这样做,您最初拥有它的方式要清楚得多。此外,任何 LINQ 版本都会因为您必须进行的 .ToList() 调用耗尽所有额外内存而变慢。
  • "这是我的嵌套 foreach 查询" 这根本不是一个查询。代码应保持原样。

标签: c# linq foreach


【解决方案1】:

ForEach 将委托作为参数。所以你可以写静态方法或匿名函数。我正在用 Anonymus 方法写作。但是你上面的方法是比使用 ForEach() 最好的方法

 xOrders.ToList().ForEach((x) => {
     x.OrderItemDetails.ToList().ForEach(o => db.Entry(o).Reload());
     x.Dispatches.ToList().ForEach((D) => {
       D.DispatchItemDetails.ToList().ForEach(DI => db.Entry(DI).Reload());
       db.Entry(D).Reload();
     });
     db.Entry(x).Reload();
   });

【讨论】:

  • 谢谢,效果很好。您的代码给了我错误,然后我只是更改了它并更新了您的答案。感谢您回答我的问题。
  • 它看起来很乱,它会降低性能,它会增加内存使用量。我不明白为什么有人想这样写代码。
  • 是的,@hazevich 你是对的。这会降低性能。但我只是出于学习目的给出答案。我也提到过,这不是正确的方法。
  • @Vishal 这样吗?你摆脱了这个异常,因为ForEach() 内部使用了for 循环,但它如何编码才能让你免于竞争条件?你的问题的根源是什么?
  • @Vishal 我想说的是您摆脱了症状,但无法治愈。如果您有一些代码可以在另一个线程中更改您的集合,您应该考虑自己进行一些线程同步。例如,使用简单锁定,即在您执行Reload() 时锁定您的收藏。因为在某些情况下,您可能有一个代码会从您的集合中删除一些元素,然后在ForEach() 中您将得到IndexOutOfRange 异常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-07
  • 1970-01-01
  • 1970-01-01
  • 2017-02-19
  • 2020-12-07
  • 2014-03-16
  • 1970-01-01
相关资源
最近更新 更多