我喜欢防御性编程。 我讨厌异常抛掷,但这不是我的问题的主题。
我修改了linQ的扩展名,以便能够使用列名
执行订单 public static IEnumerable<T> OrderBy<T>(this IEnumerable<T> list, string sortExpression)
使用防御性编程,如果列名无效,此方法将返回给定的枚举。
现在我需要使用ThenBy执行二级排序。 所以我需要那个签名:
public static IOrderedEnumerable<T> OrderBy<T>(this IEnumerable<T> list, string sortExpression)
我需要返回一个IOrderedEnumerable。 我的问题是保持我的防御性编程功能:我必须返回给定的设置,因为列名无效。
有干净的方法吗?我所想的只是一些技巧:
建议/建议? 感谢
答案 0 :(得分:3)
您可以进行任何订购。如果列不存在,只需将您的输入保持为以前的可枚举状态。为此,请创建为所有元素返回相同值的键选择器。
参见示例:
using System;
using System.Linq;
using System.Collections.Generic;
using System.Reflection;
static class Program
{
public static IOrderedEnumerable<T> OrderBy<T>(this IEnumerable<T> list, string sortExpression) where T : class
{
Func<T, Int32> keySelector = (elem) =>
{
PropertyInfo pi = typeof(T).GetProperty(sortExpression, typeof(Int32));
if (pi == null)
return 0; // return the same key for all elements
return Int32.Parse(pi.GetValue(elem, null).ToString());
};
return list.OrderBy(keySelector);
}
static void Main(string[] args)
{
// Create an array of strings to sort.
string[] fruits = { "apricot", "orange", "banana", "mango", "apple", "grape", "strawberry" };
// Sort by "column" Length
foreach (string s in fruits.OrderBy<string>("Length"))
Console.WriteLine(s);
Console.WriteLine();
// Sort by non-existing column
foreach (string s in fruits.OrderBy<string>("ength"))
Console.WriteLine(s);
Console.ReadKey();
}
}