2

我需要List<string>通过将列表与字符串进行比较来对 a 进行排序

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

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

4 回答 4

3

OrderByfalse之前的订单true

var result = list.OrderBy(s => !s.StartsWith("ki", StringComparison.OrdinalIgnoreCase))
                 .ThenBy(s => !s.ToLower().Contains("ki"));
于 2013-06-13T06:45:57.353 回答
3
var res = list.OrderBy(y=> !y.StartsWith("Ki", StringComparison.OrdinalIgnoreCase))
              .ThenBy(x => x)
于 2013-06-13T06:46:23.313 回答
2

我认为这应该有效:

list = (from str in list
        let idx = str.IndexOf(keyword, StringComparison.OrdinalIgnoreCase)
        let change = idx != 0 ? idx : int.MinValue
        orderby change
        select str).ToList();
于 2013-06-13T07:21:04.753 回答
1

您可以结合使用 LinqOrderBy和以下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;
于 2013-06-13T06:39:28.920 回答