[Mono-list] Optimising some large loops using LINQ question

David Schmitt david at dasz.at
Wed Apr 24 08:54:08 UTC 2013


On 24.04.2013 02:49, Paul Johnson wrote:
> Hi,
>
> I'm working on a project that has some very large loops in it that I'd
> like to remove and use some bits of LINQ to speed things up.
>
> The current code looks like this
>
> foreach (Task t in db.getSubscription().Tasks)
> {
>       if (t.TaskID == task.TaskID)
>       {
>            foreach (ReadTask rt in db.ReadTasks.ReadTasks)
>            {
>                if (rt.TaskID == task.TaskID)
>                {
>                     result = true;
>                     break;
>                }
>            }
>        }
> }
>
> db.getSubscription().Tasks and db.ReadTasks.ReadTasks can both be huge,
> so iterating through them could take quite a while.
>
> The LINQ I've come up with looks like this
>
> Task t = db.getSubscription().Tasks.FirstOrDefault(s => s.TaskID ==
> task.TaskID);
> if (t != null)
> {
>       ReadTask rt = db.ReadTasks.ReadTasks.FirstOrDefault(s => s.TaskID
> == task.TaskID);
>       if (rt != null)
>              result = true;
> }
>
> Questions are, are these two pieces of code equivalent and should this
> be FirstOrDefault or just First?

Without knowing what db does internally, your code looks like it could 
be simplified to this:

static bool GetTask(Task task) {
	return db.ReadTasks.ReadTasks.Any(rt => rt.TaskID == task.TaskID)
}

Assuming that there is a hidden connection between 
db.getSubscription().Tasks and db.ReadTasks.ReadTasks, using LINQ might 
not be a great idea because streaming (or not) within the LINQ methods 
might screw up your call flow.



Regards, David


More information about the Mono-list mailing list