如何使用LINQ通过使用StartsWith对自定义项进行排序

时间:2015-03-23 15:00:18

标签: c# linq

我有以下代码。这是基于使用临时容器来选择特定项目,然后将它们添加到列表的末尾。

 var allRoles = roles.Table
      .AsEnumerable().Select(p => new FirmRole
      {
          Code = p.Field<string>("RoleName"),
          Name = p.Field<string>("RoleName")
      })ToList();

        var formRoles = allRoles.Where(p => p.Code.StartsWith("f")).ToList();
        var otherRoles = allRoles.Except(formRoles).ToList();

        otherRoles.AddRange(formRoles);

这是缩短此代码并摆脱临时列表的更好方法吗?

这样的东西
 var allRoles = roles.Table
      .AsEnumerable().Select(p => new FirmRole
      {
          Code = p.Field<string>("RoleName"),
          Name = p.Field<string>("RoleName")
      }).OrderBy(x=>x.Code.StartsWith("f")).ThenBy(a=>a);

4 个答案:

答案 0 :(得分:1)

IEnumerable<T>上(就像在这种情况下),你是对的,因为OrderBy是一个稳定的排序(参见Enumerable.OrderBy此方法执行稳定排序;即,如果两个元素的键相等,则保留元素的顺序。,因此对于具有相同键的元素,它们的先前顺序是保持的。在IQueryable<T>上,这不是保证

var allRoles = roles.Table
    .AsEnumerable().Select(p => new FirmRole
    {
        Code = p.Field<string>("RoleName"),
        Name = p.Field<string>("RoleName")
    }).Distinct()
      .OrderBy(x => x.Item.Code.StartsWith("f")) 
      .ToList();

请注意,您不需要进行二次订购,因为OrderBy正如我所说的那样稳定。

Speedwise:您必须使用小型和大型套件对其进行基准测试。 OrderBy应为O(nlogn),但按true / false排序(如本例所示)可能更类似于O(n)

答案 1 :(得分:0)

第二个例子读得更好。

不要认为在Distinct()之后需要.ToList()。

希望有所帮助

答案 2 :(得分:0)

您应该使用GroupBy和ToLookup来获取您要查找的结果。

        var allRoles = roles.Table
            .AsEnumerable().Select(p => new FirmRole
            {
                Code = p.Field<string>("RoleName"),
                Name = p.Field<string>("RoleName")
            }).GroupBy(x => x.StartsWith("f")).ToLookup(g => g.Key);;

        var formRoles = allRoles[true].ToList();
        var otherRoles = allRoles[false].ToList();

答案 3 :(得分:0)

我相信您可以基于IComparer<T>界面实现自定义排序比较类,以提供所需的自定义排序:

public class CustomSortComparer : IComparer<string>
    {
        public int Compare(string x, string y)
        {
            StringComparer sc = StringComparer.CurrentCultureIgnoreCase;

            if (string.IsNullOrEmpty(x) || string.IsNullOrEmpty(y))
            {
                return sc.Compare(x, y);
            }

            if (x.StartsWith("f", StringComparison.CurrentCultureIgnoreCase) && 
                !y.StartsWith("f", StringComparison.CurrentCultureIgnoreCase))
            {
                return 1;
            }

            if (y.StartsWith("f", StringComparison.CurrentCultureIgnoreCase) && 
                !x.StartsWith("f", StringComparison.CurrentCultureIgnoreCase))
            {
                return -1;
            }

            return sc.Compare(x, y);
        }
    } 

然后致电:

var allRoles = roles.Table
      .AsEnumerable().Select(p => new FirmRole
      {
          Code = p.Field<string>("RoleName"),
          Name = p.Field<string>("RoleName")
      }).OrderBy(x => x.Code, new CustomSortComparer()).ToList();