Список сортировки, за исключением одной записи с LINQ

Я хочу заказать список строк, но одна строка в списке всегда должна быть в начале и не сортироваться. Что это самый простой способ сделать это с помощью LINQ?

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

В LINQ нет никакого метода добавления или чего-то еще?

Ответ 1

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();

Ответ 2

Вы можете использовать шаблон OrderBy, ThenBy:

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

var result = l.OrderBy(i => i != "first").ThenBy(i => i);

Ответ 3

Порядок по двум критериям. Первый критерий основан на каком-то предикате, второй - на значении элементов:

[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);
    }
}