English 中文(简体)
If statement or Where extension with a For Each loop?
原标题:

I was wondering which of the two code samples would be more efficient (or is the difference between the two negligible)?

For Each apple in AppleController.GetRedApples().Where(Function(a) PriceController.OnSale(a))
    do something
Next

or

For Each apple in AppleController.GetRedApples()
   If PriceController.OnSale(apple) Then
       do something
   End If
Next

Thanks!

最佳回答

The difference is negligible, and the second code is much more readable, so you should probably prefer that one

问题回答

I would personally separate it out:

Dim applesOnSale = AppleController.GetRedApples() _
                                  .Where(Function(a) PriceController.OnSale(a))
For Each apple in applesOnSale
    do something
Next

In a full IDE the first part could be a single line - or you could use a VB query expression like this:

Dim applesOnSale = From apple in AppleController.GetRedApples() _
                   Where PriceController.OnSale(apple)

For Each apple in applesOnSale
    do something
Next

This separates the "what items you re interested in" from "what you want to do with the items" which I personally find useful in terms of readability.

Note that in some situations the Where may not work, however - if GetRedApples returns a table from a LINQ to SQL DataContext, for example, it will try to translate the Where clause into SQL - which won t work.

Assuming you re using LINQ to Objects though, the assignment won t actually do any looping - it will just set up the query. The "where" clause will only be evaluated for each item as you loop through the query.

Consider this discussion on foreach vs linq/lambda (also answer by Jon Skeet ;-) and this one if you want to delve deeper into understanding LINQ / Lambda efficiency and performance.

The performance should be about the same, therefore I would go for the more readable approach:

var applesOnSale = from apple in AppleController.GetRedApples()
                   where PriceController.OnSale(apple)
                   select apple;

foreach(var apple in applesOnSale)
{
    //do stuff
}

This is the same as your second option but is a touch more readable.





相关问题
Manually implementing high performance algorithms in .NET

As a learning experience I recently tried implementing Quicksort with 3 way partitioning in C#. Apart from needing to add an extra range check on the left/right variables before the recursive call, ...

Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

How do I compare two decimals to 10 decimal places?

I m using decimal type (.net), and I want to see if two numbers are equal. But I only want to be accurate to 10 decimal places. For example take these three numbers. I want them all to be equal. 0....

Exception practices when creating a SynchronizationContext?

I m creating an STA version of the SynchronizationContext for use in Windows Workflow 4.0. I m wondering what to do about exceptions when Post-ing callbacks. The SynchronizationContext can be used ...

Show running instance in single instance application

I am building an application with C#. I managed to turn this into a single instance application by checking if the same process is already running. Process[] pname = Process.GetProcessesByName("...

How to combine DataTrigger and EventTrigger?

NOTE I have asked the related question (with an accepted answer): How to combine DataTrigger and Trigger? I think I need to combine an EventTrigger and a DataTrigger to achieve what I m after: when ...

热门标签