Чуть меньший код может быть достигнут с использованием лямбда-выражений, а не синтаксиса выражений, поэтому
var sorted = salesusers.OrderBy(u => u.UserName.Split('.')[1]).ThenBy(u => u.UserName.Split('.')[0]).ToList();
хотя он менее читабелен, но как только вы привыкнете к синтаксису, я нахожу его легче, чем синтаксис выражения.
РЕДАКТИРОВАТЬ: изменения для редактирования 3
Ваш код, преобразованный в Lambdas, выглядит следующим образом
var salesusers = (l.GroupBy(s => new { SalesUserId = s.SalesUserId, Username = s.Username }).Select(g =>new {
Username = g.Key.Username.Split('.')[1].ToTitleCase() + " " + g.Key.Username.Split('.')[0].ToTitleCase(),
Surname = g.Key.Username.Split('.')[1].ToTitleCase(),
Forename = g.Key.Username.Split('.')[0].ToTitleCase(),
UserId = g.Key.SalesUserId
})).OrderBy(a => a.Surname).ThenBy(a => a.Forename);
Единственное, что чем больше выражение, тем труднее его читать!
Другой способ сделать это, который читает чище, - это определить объект детали, а не использовать динамический объект.
internal class UserDetails
{
public UserDetails(User u)
{
this.Forename = u.Username.Split('.')[0].ToTitleCase();
this.Surname = u.Username.Split('.')[1].ToTitleCase();
this.UserId = u.SalesUserId;
this.Username = u.Username;
}
public string Username { get; set; }
public string Surname { get; set; }
public string Forename { get; set; }
public int UserId { get; set; }
}
тогда вы можете сделать
var salesusers = (l.GroupBy(s => new { SalesUserId = s.SalesUserId, Username = s.Username })
.OrderBy(u => u.Username.Split('.')[1].ToTitleCase())
.ThenBy(u => u.Username.Split('.')[0].ToTitleCase())
.Select(g => new UserDetails(g)));
но это больше кода, который я не уверен, что вы хотите.
Последние изменения:
ваш код не требует группировки по операторам, так что вы можете уменьшить это, выполнив
var salesusers = (
from s in l
select new
{
Username = s.Username.Split('.')[1].ToTitleCase() + " " + s.Username.Split('.')[0].ToTitleCase(),
Surname = s.Username.Split('.')[1].ToTitleCase(),
Forename = s.Username.Split('.')[0].ToTitleCase(),
UserId = s.SalesUserId
}
).OrderBy(a => a.Surname).ThenBy(a => a.Forename);
Или использование Lambdas становится
var salesusers = l.Select(g =>new {
Username = g.Username.Split('.')[1].ToTitleCase() + " " + g.Username.Split('.')[0].ToTitleCase(),
Surname = g.Username.Split('.')[1].ToTitleCase(),
Forename = g.Username.Split('.')[0].ToTitleCase(),
UserId = g.SalesUserId
}).OrderBy(a => a.Surname).ThenBy(a => a.Forename);
Кроме этого, единственный способ уменьшить этот вызов - использовать определенный класс, как указано выше, это не значит, что это невозможно сделать! но я не вижу как!
НТН
OneShot