Tuples and Projection
Sunday, February 19, 2006
Suppose you have a list of people:
IList<Person> people = new List<Person>();
people.Add(new Person("John", "Doe", "Admin"));
people.Add(new Person("John", "Doe", "Cook"));
people.Add(new Person("Sue", "Foo", "Programmer"));
people.Add(new Person("Sue", "Foo", "FlagWalker"));
And you want to select just the first and last names from it, in order to further restrict the list to distinct combinations of first and last name:
select distinct FirstName, LastName from People;
In Orcas, you'll be able to say:
var names = from p in people
select new { p.FirstName, p.LastName };
var distinctNames = names.Distinct();
In the meantime, we'll do without the syntax sugar:
IList<CTuple<string, string>> names
=
Walk.Select<Person, CTuple<string, string>>
(
people,
delegate(Person p)
{
return new CTuple<string, string>(p.FirstName, p.LastName);
}
);
IList<CTuple<string, string>> distinctNames
=
Walk.Distinct<CTuple<string, string>>(names);
We don't have anonymous tuple types yet, but we can define a set of generically overloaded types. Other differences are the lack of SQL-like syntax, type inference for locals, and extension methods.