使用不带Linq </t>的字符串对List <t>进行排序

时间:2011-04-28 07:16:55

标签: c# list sorting datatable

有没有办法使用List<T>之类的字符串(与"Name desc"相同)对DataTable.DefaultView.Sort进行排序,而不是Linq?

我正在尝试将DataTables替换为Lists,我需要它才能与旧代码兼容。

使用V4Vendetta的代码我能够创建这个扩展方法,测试似乎表明它正常工作。

public static void SortByString<T>(this List<T> list, string sortString)
{
    if (sortString == null) return;

    List<string> SortGroups = sortString.Split(',').ToList();

    for (int i = SortGroups.Count - 1; i >= 0; i--)// sort from the last group first
    {
        string tempColumn = SortGroups[i].Trim().Split(' ')[0];
        bool isAsc = SortGroups[i].Trim().Split(' ').Length > 1 ? SortGroups[i].Trim().Split(' ')[1].ToLower() == "asc" ? true : false : true;

        PropertyInfo propInfo = typeof(T).GetProperty(tempColumn);
        if (propInfo == null) // if null check to make sure its not just a casing issue.
        {
            foreach (PropertyInfo pi in typeof(T).GetProperties())
            {
                if(pi.Name.ToLower() == tempColumn.ToLower())
                {
                    tempColumn = pi.Name;
                    propInfo = typeof(T).GetProperty(tempColumn);
                    break;
                }
            }
        }

        if (propInfo != null)
        {
            Comparison<T> compare = delegate(T a, T b)
            {
                object valueA = isAsc ? propInfo.GetValue(a, null) : propInfo.GetValue(b, null);
                object valueB = isAsc ? propInfo.GetValue(b, null) : propInfo.GetValue(a, null);

                return valueA is IComparable ? ((IComparable)valueA).CompareTo(valueB) : 0;
            };

            list.Sort(compare);
        }else{
            throw new IndexOutOfRangeException("Property: '" + tempColumn + "', does not exist in '" + typeof(T).ToString() + "'");
        }


    }
}

5 个答案:

答案 0 :(得分:3)

List有一些排序方法,有些采用Comparison<T>可以实现自定义比较排序

答案 1 :(得分:3)

据我所知,此类搜索没有内置支持。所以你必须自己写。

解析字符串应该不会太难。如果您有一个类似“name asc,age desc”的排序字符串,请将其拆分为逗号(,),并将每个字符串视为名称和方向。然后,您可以对类型T使用反射来查找要排序的属性,并构建执行所需比较的方法。

在codeplex上查看这篇文章的例子:http://www.codeproject.com/KB/linq/dynamite_dynamic_sorting.aspx

答案 2 :(得分:2)

我在这些方面尝试了一些东西,也许你需要根据自己的需要即兴表达

private List<Employee> CreateSortList<T>(
                    IEnumerable<Employee> dataSource,
                    string fieldName, SortDirection sortDirection)
    {
        List<Employee> returnList = new List<Employee>();
        returnList.AddRange(dataSource);
        // get property from field name passed
        System.Reflection.PropertyInfo propInfo = typeof(T).GetProperty(fieldName);
        Comparison<Employee> compare = delegate(Employee a, Employee b)
        {
            bool asc = sortDirection == SortDirection.Ascending;
            object valueA = asc ? propInfo.GetValue(a, null) : propInfo.GetValue(b, null);
            object valueB = asc ? propInfo.GetValue(b, null) : propInfo.GetValue(a, null);
            //comparing the items
            return valueA is IComparable ? ((IComparable)valueA).CompareTo(valueB) : 0;
        };
        returnList.Sort(compare);
        return returnList;
    }

你需要传入适当的排序方向和字段名,这将是该类的属性(在我的例子中是Employee)

希望这有帮助

答案 3 :(得分:0)

答案 4 :(得分:0)

查看专门的集合名称空间。那里应该有一个排序列表。