将 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 [重复]的主要内容,如果未能解决你的问题,请参考以下文章