Сортировать список‹строка› по сравнению со строкой

Мне нужно отсортировать List<string>, сравнив список со строкой

например: у меня есть список, содержащий следующие элементы.

Kaboki
kriiki
Kale
Kutta
Kiki
Kicki
Krishna
Kseaki

Ключевое слово поиска: ki Мне нужно отсортировать элементы списка с помощью ключевого слова таким образом, чтобы строки, совпадающие в начале строки, были первыми, а строка, имеющая совпадающую строку в другой позиции, должна быть последней

Вот мой текущий код

    public static List<string> GetLocations(string prefixText)
    {
        try
        {
            DataTable dtlocs = (DataTable) HttpContext.Current.Session["locations"];
            var dValue = from row in dtlocs.AsEnumerable()
                         where row.Field<string>("Location_Name").ToLower().Contains(prefixText.ToLower())
                         select row.Field<string>("Location_Name");

            var results = dValue.OrderBy(s => s.IndexOf(prefixText, StringComparison.Ordinal));
            var str = new List<string>(results.ToList());

            if (!str.Any())
                str.Add("No locations found");
            return str;
        }
        catch (Exception)
        {
            var str = new List<string> {"No locations found"};
            return str;
        }
    }

Здесь я могу получить первые совпадающие значения вверху, но не могу отсортировать оставшиеся значения

а у меня другая проблема. есть слово King Koti, и я ищу Ko, и это слово приходит первым. Я думаю, это происходит потому, что строка имеет две подстроки, и одна из подстрок начинается с совпавшего слова.

и могу ли я сделать совпадающие буквы жирным шрифтом ??


person Krishna Thota    schedule 13.06.2013    source источник


Ответы (3)


Я думаю, что это должно работать:

list = (from str in list
        let idx = str.IndexOf(keyword, StringComparison.OrdinalIgnoreCase)
        let change = idx != 0 ? idx : int.MinValue
        orderby change
        select str).ToList();
person Tu Tran    schedule 13.06.2013

OrderBy заказы false до true:

var result = list.OrderBy(s => !s.StartsWith("ki", StringComparison.OrdinalIgnoreCase))
                 .ThenBy(s => !s.ToLower().Contains("ki"));
person cuongle    schedule 13.06.2013
comment
@KrishnaThota: Не могли бы вы опубликовать ожидаемый результат? - person cuongle; 13.06.2013

Вы можете использовать комбинацию OrderBy Linq и методы IndexOf:

var input = ...
var search = "ki";
var results = input.Select(Value => new { Value, Index = s.IndexOf(search, StringComparison.InvariantCultureIgnoreCase) })
                   .Where(pair => pair.Index >= 0)
                   .OrderBy(pair => pair.Index)
                   .Select(pair => pair.Value);

Или в синтаксисе запроса:

var results = 
   from s in input
   let i = s.IndexOf(search, StringComparison.InvariantCultureIgnoreCase)
   where i >= 0
   orderby i
   select s;
person p.s.w.g    schedule 13.06.2013
comment
Я думаю, что это поместит входы без появления поиска в верхней части результатов. - person Rawling; 13.06.2013
comment
@Rawling Спасибо, теперь это должно быть исправлено. - person p.s.w.g; 13.06.2013