0

我有很多实体,我想编写一些通用排序类,它可以为我提供给定对象和属性的排序列表。例如

Class Country
{
      public int id { get; set; }
      public string CountryName { get; set; }
}

现在我应该能够将未排序的 List 以及应该对其进行排序的属性名称传递给我的排序器类。到目前为止,我已经打败了自己很长一段时间,现在被卡住了。任何帮助将不胜感激。

4

4 回答 4

1

LINQ使用 .NET扩展方法,或者更具体地说,动态 LINQ 部分可以轻松实现按属性名称排序。查看Scott Gu 编写的Dynamic LINQ(第 1 部分:使用 LINQ 动态查询库),了解它是如何工作的。本质上,您的排序器类只不过是 LINQ 扩展OrderByOrderByDescending.

这是一个例子:

var sortedCountries = listOfCountries.OrderBy("CountryName");

或者,如果您熟悉泛型,您可以编写一个接受集合的包装器,以及Func<TSource, TKey>用于选择属性值的包装器,如下所示:

public class MySorterClass
{
    public IEnumerable<TSource> OrderList<TSource, TKey>(IEnumerable<TSource> list, Func<TSource, TKey> selector)
    {
        return list.OrderBy(selector);
    }

    public IEnumerable<TSource> OrderList<TSource>(IEnumerable<TSource> list, string propertyName)
    {
        return list.OrderBy(propertyName);
    }
}
于 2012-08-27T19:43:34.183 回答
0

如果您使用的是 Java,请查看Collections.Sort(...)。有两个版本,一个我认为使用元素的自然顺序对它们进行排序(看看Compareable)接口,另一个采用Comparator。要么应该工作。否则,我相信其他语言也有非常相似的东西。

于 2012-08-27T17:06:11.293 回答
0

解决方法:

你没有提到语言。c#你可以让你的类实现接口IComparable并添加函数,CompareTo它接受两个参数并返回一个更大的参数,或者使用匿名函数做同样的事情。

于 2012-08-27T17:07:31.180 回答
0

最后,我能够实现通用排序器并将其作为扩展方法,因此我可以在使用 List 的任何地方使用它,下面是我的实现。sortorder 是 Asc/Desc,propertyname 是类型 T 的属性的名称。这很好用,我对此很满意。

public static List<T> SortedListWithLamda<T>(this List<T> list, string sortorder, string propertyname)
        {
            List<T> sortedlist = new List<T>();
            if (!string.IsNullOrEmpty(propertyname) && list != null && list.Count > 0)
            {

                Type t = list[0].GetType();

                if (sortorder == "A")
                {

                    sortedlist = list.OrderBy(
                        a => t.InvokeMember(
                            propertyname
                            , BindingFlags.GetProperty
                            , null
                            , a
                            , null
                        )
                    ).ToList();
                }
                else
                {
                    sortedlist = list.OrderByDescending(
                        a => t.InvokeMember(
                            propertyname
                            , BindingFlags.GetProperty
                            , null
                            , a
                            , null
                        )
                    ).ToList();
                }
            }
            return sortedlist;
        }
于 2012-08-28T20:15:33.313 回答