tags:

views:

57

answers:

4

Hi, I want to use List.Find() on a simple collection that does not implement Find(). The naive way I thought of, is to just wrap it with a list and execute .Find(), like this:

ICollection myCows = GetAllCowsFromFarm(); // whatever the collection impl. is...
var steak = new List<Cow>(myCows).Find(moo => moo.Name == "La Vache qui Rit");

Now, 1st of all I'd like to know, C#-wise, what is the cost of this wrapping? Is it still faster to 'for' this collection the traditional way?

Second, is there a better straightforward way elegantly use that .Find()?

Cheers!

A: 

Use Enumerable.Where:

var steak = myCows.Where(moo => moo.Name == "La Vache qui Rit");

This has the advantage of not costing you a complete copy of the collection.

EDIT: D'oh! @Roger's answer is better.

Marcelo Cantos
+2  A: 

List<T>, when constructed with an IEnumerable (i.e. your ICollection), copies the content. This could be expensive.

Do you have LINQ available? If so, you can use the First extension method, which returns the first match found (or throws an exception if there's no match). This will work on any IEnumerable<T>:

var cattle = GetAllCows();
var steak = cattle.First(moo => moo.Name == "La Vache qui Rit");

You can also use Where, which will return all the matches:

var cattle = GetAllCows();
var matches = cattle.Where(moo => moo.Name == "La Vache qui Rit");

There's a heap of useful extension methods in the Enumerable class. LINQ is not just for databases.

Roger Lipscombe
A: 

You can use linq for this:

using System.Linq;

...

var steak = myCows.First(moo => moo.Name == "La Vache qui Rit"); 
klausbyskov
A: 

I'll just add to you guys the use of .FirstOrDefault() to avoid exception, WDYT?

Bilal