So in the last post there was something like this:
public List<K> SelectUserNameList<K>(Func<User, K> selectMethod, List<User> userList)
{
return userList.Select(selectMethod, userList).ToList();
}
Called by this:
List<String> newList = userList.Select(user => user.Name, userList);
Ok so what if you want to order something? Well same idea, just another Func. But remember, a Func that can order by any type. If you look at the OrderBy method, it expects a Func<User, L> where L is just some type you are returning. If you were ordering by UserID, well that would be an integer. Problem is, like select, you don’t want to be held down by a specific type.
public List<K> SelectFromUserList<K, L>(Func<User, K> selectMethod, Func<User, L> orderBy, List<User> userList)
{
List<K> userList = new List<K>();
userList = userList.OrderBy(orderBy).Select(selectMethod).ToList();
return userList;
}
And the new call would be:
List<String> newList = userList.Select(selectUser => selectUser.Name, orderUser => orderUser.ID, userList);
Now something of note is the order in which you call the methods. Remember, x.OrderBy().Select() is saying take collection X, order it by L and create a new collection of X, then select whatever you want. You can not do the reverse. Say you want to select a list of UserNames ordered by UserName. Well you can either:
1) Order the list by user name in a list of users then select the user names.
2) Select a list of user names into a list of strings, order that list by a string.
What if you want to select user names but order by user id? You can:
1) Order the list by user id and create a list of users then select the user names.
2) Select a list of user names into a list of string and… eh LOSE
Best part about:
userList = userList.Select(selectMethod).OrderBy(orderBy).ToList();
Is that the error is somewhat misleading. It gives you the “Cannot be inferred by usage” error, not the “Idiot, you can’t order a list of Strings by UserID”. So you have to be careful on how you have things in order.