用LINQ排序除一个条目外的列表
本文关键字:一个 列表 排序 LINQ | 更新日期: 2023-09-27 18:11:24
我想订购字符串列表,但列表中的一个字符串应始终在开始且不排序。用LINQ做这件事最简单的方法是什么?
//should be ordered in: first, a,b,u,z:
List<string> l = {"z","u","first","b","a"};
在LINQ中没有prepend方法或其他东西,是吗?
l = l.OrderBy(i => i != "first").ThenBy(i => i).ToList();
这里的技巧是根据所讨论的物品是否是您的特殊物品来订购,然后像您平常一样按您的物品来订购。
既然你说你想排序一个列表(使用linq),不要忘记将查询的结果赋值回给列表。
你还问了一个preend方法,这个怎么样:
l = new[] { "first" }.Concat(l).ToList();
你可以很容易地使它成为一个扩展方法:
public static class LinqExtensions
{
public static IEnumerable<T> Prepend<T>(this IEnumerable<T> query, T item)
{
return new[] { item }.Concat(query);
}
}
称为:
l = l.Prepend("first").ToList();
您可以使用OrderBy
, ThenBy
模式:
string[] l = { "z", "u", "first", "b", "a" };
var result = l.OrderBy(i => i != "first").ThenBy(i => i);
按两个条件排序。第一个条件基于某种谓词,第二个条件基于条目的值:
[TestMethod]
public void TestMethod1()
{
var list = new[] { "z", "u", "first", "b", "a" }.OrderByPredicateFirst(s => s == "first").ToList();
Assert.AreEqual("first", list[0]);
Assert.AreEqual("a", list[1]);
Assert.AreEqual("b", list[2]);
Assert.AreEqual("u", list[3]);
Assert.AreEqual("z", list[4]);
}
public static class Extensions
{
public static IEnumerable<T> OrderByPredicateFirst<T>(this IEnumerable<T> source, Predicate<T> firsts)
{
return source
.OrderBy(s => firsts(s) ? 0 : 1)
.ThenBy(s => s);
}
}