【问题标题】:Transform foreach to LINQ [duplicate]将 foreach 转换为 LINQ [重复]
【发布时间】:2019-07-22 09:10:46
【问题描述】:

我有两个集合,都包含对象。

第一个是IList,第二个是Dictionary。

我需要遍历IList,如果条件满足,则从存储在Dictionary中的某个对象激活方法。

目前的情况是这样的:

 foreach (MyObject mo in MyListOfObjects)
 {
      if (mo.Active == myStatus.Enabled)
      {
           DictList[mo.ID].Start();
      }
  }

到目前为止,我已经这样做了:

var r = MyListOfObjects.Where(mo => mo.Active == myStatus.Enabled);

但我不知道如何包含在这个DictList[mo.ID].Start();

【问题讨论】:

  • 你为什么要这个?在这里使用 Linq 绝对没有任何好处。只是另一种语法。除此之外,Linq 中的 Q 代表 querying,而不是 modifying 或您想要在 Start 中执行的任何操作。
  • 如果您真的认为这更具可读性,您可以删除循环内的显式测试。没有有效增益 foreach(MyObject mo in MyListOfObjects.Where(o => o.Active == myStatus.Enabled)) DictList[mo.ID].Start();
  • need to traverse... 存储在字典中如果你遍历字典,为什么它在字典中?
  • 如果您包含Select(mo => DeictList[mo.ID]),那么您可以循环该结果并调用您的方法foreach(var x in r) x.Start();。

标签: c# linq


【解决方案1】:

linq 的使用不是很好,但您可以使用 linq 过滤列表,然后循环遍历它。

var itemsToStart = MyListOfObjects.Where(mo => mo.Active == myStatus.Enabled)
    .Select(mo=> DictList[mo]); //or ToList() if you intend to re-iterate 

foreach (var itemToStart in itemsToStart) {
    itemToStart.Start();
}

【讨论】:

    【解决方案2】:

    如果有的话,只需删除内部的if

    foreach (MyObject mo in MyListOfObjects.Where(x => x.Active == myStatis.Enabled))
    {
         DictList[mo.ID].Start();
    }
    

    但这是您应该做的全部 - 它完全可读且可维护。

    【讨论】:

    • 这与 OP 已经拥有的完全相同(尽管进行了迭代)。
    • @HimBromBeere 当然是,它只是避免了一点嵌套
    【解决方案3】:
    MyListOfObjects.Where(mo => mo.Active == myStatus.Enabled).ToList().ForEach(mo => DictList[mo.ID].Start());
    

    找到ForEach:https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.list-1.foreach?view=netframework-4.7.2

    【讨论】:

    • ForEach 仅在列表中,因此这甚至行不通。只是调用ForEach 转换为列表并没有任何好处
    • 内置的 ForEach 方法在 List<T> 上,而不是在 IEnumerable<T> 上,所以这不会编译。需要一个ToList 电话,如果这是一个好的选择,充其量是值得怀疑的。
    • 他的对象叫MyListOfObjects,所以我猜是List :)
    • @Candide,当您致电 Where(...) 时,您会将其转换为 IEnumerable<WhateverListWas>
    • @Candide 可能是这样,但是你之后调用了Where,它返回了一个IEnumerable<T>。
    猜你喜欢
    • 2016-09-30
    • 1970-01-01
    • 2021-06-05
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 2021-01-22
    • 2014-03-16
    相关资源
    最近更新 更多