首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用StartWith对自定义项进行排序

如何使用StartWith对自定义项进行排序
EN

Stack Overflow用户
提问于 2015-03-23 23:00:18
回答 4查看 95关注 0票数 2

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

代码语言:javascript
运行
复制
 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);

缩短代码并去掉临时列表是不是更好的方法?

就像这样

代码语言:javascript
运行
复制
 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);
EN

回答 4

Stack Overflow用户

发布于 2015-03-23 23:05:39

IEnumerable<T>上(如本例所示),您是对的,因为OrderBy是一种稳定的排序方法(参见Enumerable.OrderBy:此方法执行一种稳定的排序;也就是说,如果两个元素的键相等,则元素的顺序将保持不变。),因此对于具有相同键的元素,其先前的顺序将保持不变。在IQueryable<T>上,这是不能保证的。

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2015-03-23 23:05:00

第二个例子读起来更好。

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

希望这能有所帮助

票数 0
EN

Stack Overflow用户

发布于 2015-03-24 00:16:59

您应该使用GroupBy和ToLookup来获得您想要的结果。

代码语言:javascript
运行
复制
        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();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29213517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档