【问题标题】:Interchange Item position of anonymous type匿名类型的交换项位置
【发布时间】:2013-02-17 05:46:29
【问题描述】:

我使用以下代码填充了匿名类型的排序列表。

var list = service.GetTenantsOverview()
                  .TenantsOverview
                  .Cast<TenantOverview>()
                  .Select(t => new { t.TenantId, t.Tenantnumber })
                  .OrderBy(t => t.Tenantnumber)
                  .ToList();

问题是,我需要将第 3 个项目移到第 1 个位置。这意味着,我想将租户编号“任何”移动到第一个位置。但是没有找到任何合适的方法来做到这一点。

对于解决方案,我编写了以下代码。

var item = list.First(f => f.Tenantnumber == "Any");
        list.Remove(item);
        list.Insert(0, item);

效果很好。

我想知道如何在单个语句中使用 LINQ 完成上述工作?还是可以在一个语句中做到这一点?

【问题讨论】:

    标签: c# linq linq-to-entities anonymous-types


    【解决方案1】:

    尝试按租户编号是否为“Any”进行初始排序(注意false 默认位于true 之前,因此您需要将其降序排列):

    busConfigurationService.GetTenantsOverview()
                           .TenantsOverview
                           .Cast<TenantOverview>()
                           .Select(t => new { t.TenantId, t.Tenantnumber })
                           .OrderByDescending(t => t.Tenantnumber == "Any")
                           .ThenBy(t => t.Tenantnumber)
                           .ToList()
    

    【讨论】:

      【解决方案2】:

      先使用 OrderBy,然后使用 ThenBy

      yourCurrentQuery.OrderBy(t => t.Tenantnumber == "Any" ? 0 : 1)
                      .ThenBy(t => t.Tenantnumber);
      

      Ani's answer 展示了大部分相同的技术,并且肯定会奏效。但是,我通常不喜欢依赖布尔值进行排序,因为我发现它不是很直观。我不希望所有人都会分享我相同的挂断。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-19
        相关资源
        最近更新 更多