Transform foreach to LINQ
我有两个集合,都包含对象。
第一个是IList,第二个是Dictionary。
我需要遍历ilist,如果条件已满,则从存储在Dictionary中的某个对象激活方法。
目前的情况是这样的:
1 2 3 4 5 6 7
| foreach (MyObject mo in MyListOfObjects)
{
if (mo.Active == myStatus.Enabled)
{
DictList[mo.ID].Start();
}
} |
到目前为止,我已经做到了:
1
| var r = MyListOfObjects.Where(mo => mo.Active == myStatus.Enabled); |
但我不知道该如何包括在这个DictList[mo.ID].Start();中
- 你为什么要这个?在这里使用LINQ绝对没有好处。只是另一种语法。除此之外,linq中的q代表查询,而不是修改,或者您想在Start中做什么。
- 如果您真的认为这更具可读性,那么可以删除循环中的显式测试。没有有效增益foreach(myListofObjects.where(o=>o.active==myStatus.enabled))dictlist[mo.id].start();
- 需要穿越…如果你遍历一个字典,它会很好地存储在字典中。为什么它会存储在字典中?
- 如果包含一个Select(mo => DeictList[mo.ID]),那么可以循环该结果并调用方法foreach(var x in r) x.Start();。
对LINQ的使用不是很好,但是您可以使用LINQ过滤列表,然后循环使用它。
1 2 3 4 5 6
| 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();
} |
如果有什么问题的话,就把里面的if取下来。
1 2 3 4
| foreach (MyObject mo in MyListOfObjects.Where(x => x.Active == myStatis.Enabled))
{
DictList[mo.ID].Start();
} |
但这就是你应该做的全部——它是完全可读和可维护的。
- 这是完全相同的操作已经有(尽管从迭代)。
- @当然,它只是避免了一点筑巢。
1
| 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?视图=NetFramework-4.7.2
- ForEach只是在一个列表中,所以这甚至都不起作用。转换成一个列表,仅仅是调用ForEach,没有什么好处。
- 内置的ForEach方法在List上,而不是在IEnumerable上,因此无法编译。需要一个ToList电话,如果这是一个好的选择,最好是有问题的。
- 他的物体叫MyListOfObjects,所以我猜是List。
- @ CordDe,当你调用EDOCX1,8时,你把它变成EDCOX1,9。
- 可能是,但是你已经调用EDOCX1 10,然后返回EDCOX1,4。
- 啊,是的,我忘了。我通常对IEnumerable上的foreach有自己的扩展名
- 这就是为什么IEnumerable博客没有ForEach的原因。msdn.microsoft.com/ericlippert/2009/05/18/…
- @朱哈,这是一个论点,但我不同意。"当我们提供两种微妙不同的方法来做完全相同的事情时,我们会在行业中产生混乱。"我没有感到困惑。拜托,如果我们同意这个声明,那么LINQ扩展本身就不应该首先被写出来。
- 还应该注意的是,ToList().ForEach首先迭代linq查询以创建中间列表,然后迭代该列表以调用ForEach中的代码并丢弃该列表。
- 我知道,但实际上,这家伙是个新程序员。你真的认为他会通过重复两次来面对任何性能问题吗?
- @坦率地说,我认为更大的优势在于它的可读性较低,这不仅仅是因为如果你感到困惑,还因为另一个程序员必须查看你的代码。您必须记住,代码的一半原因是向其他程序员表达您正在尝试做的事情。