我需要通过将列表与字符串
进行比较来对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
,这个单词首先出现。我认为这是因为,字符串有两个子字符串,其中一个子字符串以匹配的单词开头。
我可以将匹配的字母变成粗体吗?
答案 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的OrderBy
和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;
答案 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();