在我的C#代码中,我需要评估两个非null变量.我制定了一组if-else if语句,但在我看来它看起来很丑陋而且有点过于草率,即使它是正确的.
我查看了MSDN Library,只查看了基于单个变量的选择示例.
是否有更清洁,更紧凑的方式来实现相同的结果?
更新:我填写代码以提供更多上下文.再看一下,也许我可以根据参数直接操作linq查询.但是,我提出的问题是我想要关注的通用问题:选择而不是选择后使用的代码.
public ActionResult Index(string searchBy, string orderBy, string orderDir)
{
var query = fca.GetResultsByFilter(searchBy);
if (orderBy == "Campus" && orderDir == "Asc")
{
query = query = query.OrderBy(s => s.Campus).ThenBy(s => s.Student_Name);
}
else if (orderBy == "Campus" && orderDir == "Desc")
{
query = query.OrderByDescending(s => s.Campus);
}
else if (orderBy == "Student Name" && orderDir == "Asc")
{
query = query = query.OrderBy(s => s.Student_Name);
}
else if (orderBy == "Student Name" && orderDir == "Desc")
{
query = query.OrderByDescending(s => s.Student_Name);
}
else if (orderBy == "Course Count" && orderDir == "Asc")
{
query = query.OrderBy(s => s.Course_Count);
}
else if (orderBy == "Course Count" && orderDir == "Desc")
{
query = query.OrderByDescending(s => s.Course_Count);
}
}
Run Code Online (Sandbox Code Playgroud)
您可以使用或创建一个扩展方法来IQueryable处理排序:OrderByOrderByDescending
public static class QueryableExtensions
{
public static IOrderedQueryable<TSource> OrderByWithDirection<TSource,TKey>
(this IQueryable<TSource> source,
Expression<Func<TSource, TKey>> keySelector,
string orderDir)
{
return orderDir == "Desc"
? source.OrderByDescending(keySelector)
: source.OrderBy(keySelector);
}
}
Run Code Online (Sandbox Code Playgroud)
我假设你的GetResultsByFilter方法返回一个IQueryable<>. 如果它实际上返回一个IEnumerable<>,那么扩展方法将需要接受一个IEnumerable<TSource> source参数并返回一个IOrderedEnumerable<TSource>。
然后可以按如下方式使用:
public ActionResult Index(string searchBy, string orderBy, string orderDir)
{
var query = fca.GetResultsByFilter(searchBy);
switch (orderBy)
{
case "Campus":
query = query.OrderByWithDirection(s => s.Campus, orderDir);
break;
case "Student Name":
query = query.OrderByWithDirection(s => s.Student_Name, orderDir);
break;
case "Course Count":
query = query.OrderByWithDirection(s => s.Course_Count, orderDir);
break;
}
if (orderBy == "Campus" && orderDir == "Asc")
{
// The Campus Asc case was also ordered by Student_Name in the question.
query = query.ThenBy(s => s.Student_Name);
}
}
Run Code Online (Sandbox Code Playgroud)