Как использовать два критерия заказа в C #? - PullRequest
0 голосов
/ 15 июля 2009

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

items = items
   .Where(a => a.Contains(contained))
   .OrderBy(a => a)
   ;
var startsWith = items.Where(a => a.StartsWith(contained));
items = startsWith.Union(items.Except(startsWith));

Что мне делать?

Ответы [ 3 ]

5 голосов
/ 15 июля 2009

Как и вариант Майкла, вы также можете заказать по логическому:

items = items.OrderBy(x => !x.Contains(contained))
             .ThenBy(x => x);

Обратите внимание, что false сортирует перед true, следовательно,! здесь - вы также можете использовать условное выражение, чтобы сделать его более понятным:

items = items.OrderBy(x => x.Contains(contained) ? 0 : 1)
             .ThenBy(x => x);

Тестовая программа:

using System;
using System.Linq;

public class Test
{
    static void Main()
    {
        var items = new string[] { "the", "quick", "brown", "fox", 
                "jumps", "over", "the", "lazy", "dog" };

        var query = items.OrderBy(x => !x.Contains("o"))
                         .ThenBy(x => x);

        foreach (string word in query)
        {
            Console.WriteLine(word);
        }
    }
}

Выход:

brown
dog
fox
over
jumps
lazy
quick
the
the
5 голосов
/ 15 июля 2009

Заменить setsWith.Union на StartWith.Concat

2 голосов
/ 15 июля 2009

Вы можете использовать другое предложение OrderBy.

items = items.Where(a => a.Contains(contained))
   .OrderBy(a => a.StartsWith(contained) ? 0 : 1)
   .ThenBy(a => a);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...