On Monday Luca Bolognese held an introduction to C# 3.0, where he takes a C# 2.0 program and convert it to C# 3.0.
As he goes along, the code becomes much shorter, and it becomes much clearer!

Starting with memory object he iterates over a collection of objects using the standard foreach loop. Lets say you've got a list of Customer objects in a variable customers:

List<Customer> londonCustomers = new List<Customer>();
foreach (Customer c in customers) {
if (c.City == "London")
londonCustomers.Add(c); }

The above code is your normal way of iterating your objects, but with C# 3.0 and LINQ, you can really do it a lot smarter:

NorthwindDataContext db = new NorthwindDataContext();
var customers = from c in db.Customers
where c.City == "London"
select c;

The above code, takes some time to get used to, but what you get is something a lot easier to do, and you get intellisense along with compile time checking of you types!
var customers, might be a little difficult to understand, because has C# 3.0 now become a dynamic language? No! What goes on underneath, is that the compiler is smart enough to know what type is on the right side of the statement, which makes the customer variable strongly typed!

All the above is a simplification of what Luca presented, and is not even his code. Therefore, his presentation was of course a lot more interesting and a lot more fun :)