Friday, August 22, 2008

Speaking of Select

So like Where and other fine Extension methods, Select allows you to either give it a lambda expression like so:
  List<String> newList = userList.Select(user => user.Name);
Or
  List<Int32> newList = userList.Select(user => user.ID);
So either you get a list of Names or IDs. What the hell do you care? Well if you are capable of breathing, you should also notice that one list is a list of strings the other a list of integers. What if you wanted a generic select method? Well for starters you would do something like this:
public List<String> SelectFromUserList(Func<User, String> selectMethod, List<User> userList)
{
  return userList.Select(selectMethod).ToList();
}
Where the select method for a user name would be something like this:
  List<String> nameList = SelectFromUserList(currentUser => currentUser.UserName, userList);
Sweet... oh wait, that only works if I want a list strings. Great if I wanted LastName, FirstName, ect but sucks if I wanted an integer ID.
  List<String> nameList = SelectFromUserList(currentUser => currentUser.UserID, userList); //BOOM
But wait, you can do that!
public List<K> SelectUserNameList<K>(Func<User, K> selectMethod, List<User> userList)
{
  return userList.Select(selectMethod).ToList();
}
Aw snap, now I can get a list of anything I want, well at least a one type, one dimensional array. By the way, this is the first step in probably a series of posts that will end up with a much cleaner way of doing this.

No comments: