【问题标题】:Sort a List<string> comparing with a string将 List<string> 与字符串进行比较
【发布时间】:2013-06-09 11:04:10
【问题描述】:

我需要通过将列表与字符串进行比较来对List&lt;string&gt; 进行排序

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

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

我可以把匹配的字母加粗吗??

【问题讨论】:

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


    【解决方案1】:

    OrderBytrue 之前订购false

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

    【讨论】:

    • @KrishnaThota:你能发布你的预期结果吗?
    【解决方案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();
    

    【讨论】:

      【解决方案3】:

      您可以结合使用 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;
      

      【讨论】:

      • 我认为这会将没有发生搜索的输入放在结果的顶部。
      • @Rawling 谢谢,现在应该修复了
      【解决方案4】:
      var res = list.OrderBy(y=> !y.StartsWith("Ki", StringComparison.OrdinalIgnoreCase))
                    .ThenBy(x => x)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-28
        • 1970-01-01
        • 2016-07-22
        • 2021-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-08
        相关资源
        最近更新 更多