将 foreach 转换为 LINQ [重复]

Posted

技术标签:

【中文标题】将 foreach 转换为 LINQ [重复]【英文标题】:Transform foreach to LINQ [duplicate] 【发布时间】: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(); 【参考方案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>

以上是关于将 foreach 转换为 LINQ [重复]的主要内容,如果未能解决你的问题,请参考以下文章

将 Foreach 转换为 linq 表达式

来自多个 Foreach 的 Linq

使用 linq 将列表转换为字典,而不用担心重复

如何使用 linq 将列表中的列表转换为单个列表 [重复]

似乎无法将 int 转换为 linq 表达式中的字符串 [重复]

如何使用 Lambda 或 Linq 将匿名类型转换为原始类型成员