【问题标题】:Sorting a list alphabetically with lambda after a certain position在某个位置之后使用 lambda 按字母顺序对列表进行排序
【发布时间】:2013-06-24 17:42:42
【问题描述】:

给定一个包含三个必须始终位于顶部的元素的列表:

Stay@Top1
Stay@Top2
Stay@Top3
Chicken
Bull
Zebra
Elephant
Hippo

使用 lamdba 表达式,如何按字母顺序对列表进行排序,从“鸡”开始,并将前三个元素保持在顶部?

提前感谢任何提示!

【问题讨论】:

标签: c# list sorting lambda


【解决方案1】:

取前三个项目,然后与排序后的余数连接。

lst.Take(3).Concat(lst.Skip(3).OrderBy(s=>s);

【讨论】:

  • 非常感谢,由于通过引用将列表传递到函数中,这与添加 ToList() 一起工作。
【解决方案2】:

试试这个:

list.Take(3).Concat(list.Skip (3).OrderBy (x => x.Name))

【讨论】:

  • 我猜我以为他正在使用DbSet。可以接受也可以离开。
  • 如果他是,那么首先你可能不想这样做。许多查询提供者将能够将整个事情变成一个有效的查询,而不是执行 2 db 查询的代码。如果您的数据库提供程序无法将其转换为单个查询,并且您的目标是确保使用 linq to objects 执行Concat,那么您应该使用AsEnumerable。它实现了该目标,而不会产生创建列表和迭代序列的性能成本,并且它还在语义上表示您正在尝试实现的目标。
  • @Servy 是有道理的,无论哪种情况,我都只是在 LINQPad 上测试了这个,并且数据返回没有正确排序第二部分,实际上看起来排序甚至不起作用。
  • 这行得通,非常感谢您的贡献!事实证明,无论如何我都必须将 ToList() 添加到此末尾,因为我通过 ref 将列表传递给函数:)
【解决方案3】:

给定一个List<T>,您希望对其进行排序但将前三个元素保留在开头,您可以使用List<T>.Sort(int index, int count, IComparer<T> comparer) 的重载,它允许您指定要排序的元素范围。

所以你可以这样做(假设List<string>):

lst.Sort(3, lst.Length - 3, Comparer<string>.Default);

这并没有像您要求的那样使用 lambda - 但我不明白您为什么需要使用 lambda。 ;)

如果可以使用就地排序,效率会更高。

【讨论】:

  • 感谢您的建议!我决定采用不同的答案,但你的方法很有趣!
【解决方案4】:
var final = lst.Take(3).ToList(); ;

var sortedSet = lst.Skip(3).OrderBy(x => x);

final.AddRange(sortedSet);

【讨论】:

  • 我正在尝试这个线程中建议的每个方法,这是我第一个正常工作的方法。谢谢先生的贡献!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-02
  • 2014-02-08
  • 1970-01-01
  • 2015-10-30
  • 1970-01-01
相关资源
最近更新 更多