17

我想订购一个字符串列表,但列表中的一个字符串应始终位于开头且未排序。使用 LINQ 执行此操作的最简单方法是什么?

//should be ordered in: first, a,b,u,z:
List<string> l = {"z","u","first","b","a"};  

LINQ 中没有前置方法或其他东西,是吗?

4

3 回答 3

34
l = l.OrderBy(i => i != "first").ThenBy(i => i).ToList();

这里的诀窍是根据有问题的物品是否是您的特殊物品来订购,然后像往常一样按您的物品订购。

既然您说要订购列表(使用 linq),请不要忘记将查询结果分配回列表。


您还询问了 prepend 方法,这个怎么样:

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();
于 2013-04-29T11:39:21.650 回答
4

您可以使用OrderBy,ThenBy模式:

string[] l = { "z", "u", "first", "b", "a" };

var result = l.OrderBy(i => i != "first").ThenBy(i => i);
于 2013-04-29T11:39:26.087 回答
1

按两个标准排序。第一个标准基于某种谓词,第二个标准基于项目的价值:

[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);
    }
}
于 2013-04-29T11:40:10.357 回答