对List <string>进行排序与​​字符串</string>进行比较

时间:2013-06-13 06:36:38

标签: c# asp.net list sorting string-matching

我需要通过将列表与字符串

进行比较来对List<string>进行排序

例如: 我有一个包含以下项目的列表。

Kaboki
kriiki
Kale
Kutta
Kiki
Kicki
Krishna
Kseaki

搜索关键字是ki我需要使用关键字对列表项进行排序,使得在字符串start中匹配的字符串应该是第一个,而字符串在另一个中具有匹配的字符串位置必须在最后

这是我目前的代码

    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,这个单词首先出现。我认为这是因为,字符串有两个子字符串,其中一个子字符串以匹配的单词开头。

我可以将匹配的字母变成粗体吗?

4 个答案:

答案 0 :(得分:3)

var res = list.OrderBy(y=> !y.StartsWith("Ki", StringComparison.OrdinalIgnoreCase))
              .ThenBy(x => x)

答案 1 :(得分:2)

OrderBy之前

false订单true

var result = list.OrderBy(s => !s.StartsWith("ki", StringComparison.OrdinalIgnoreCase))
                 .ThenBy(s => !s.ToLower().Contains("ki"));

答案 2 :(得分:1)

您可以结合使用Linq的OrderByIndexOf方法:

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;

答案 3 :(得分:1)

我认为这应该有效:

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