我从数据库Sytem.Collections.generic.IList
获取并按searchText
过滤:
String searchText="E";
var query = something().List();
query = query.Where(x => !string.IsNullOrEmpty(x.Name) &&
x.Name.ContainsInsensitive(searchText)).ToList();
result = query.Select().ToList();
现在我希望结果按Name
列排序。首先是以searchText
开头的所有值,然后是包含searchText
的所有值。
如果我写这个:
result = result.OrderBy(x => x.Name).ToList();
我得到按名称排序的结果,例如:
1. "A name"
2. "B name"
3. "E name"
4. "F name"
所有这些都包含e
中的Name
。我想我的意思是:
1. "E name"
2. "A name"
3. "B name"
4. "F name"
我应该在OrderBy
表达式中更改哪些内容?
答案 0 :(得分:13)
使用OrderBy
和ThenBy
.OrderBy(x => x.Name.StartsWith(searchText) ? 0 : 1)
.ThenBy(x => x.Name)
答案 1 :(得分:10)
您可以在另一个之后进行两次排序调用(第一个OrderBy
,后续所有ThenBy
):
result.OrderBy(x => !x.Name.StartsWith(searchText)).ThenBy(x => x.Name).ToList();
这将首先排序true(1),然后排序(0)false。 !x.Name
使订单正确。然后它在两个组中的x.Name
上排序。
答案 2 :(得分:3)
根据您的代码,您<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="fade">
<h1 style="text-indent: 7em; font-family: Ravie; color: khaki;"> Indie-GO!</h1>
</div>
具体化为result
:
List<T>
然后您重新重新并重新分配列表:
result = query.Select().ToList();
所以我建议排序 result = result.OrderBy(x => x.Name).ToList();
而不是in-place
:
OrderBy
答案 3 :(得分:2)
我认为你关心的是搜索字符串的索引。所以匹配searchText
的字符串会更快成为第一个。这是例子:
String searchText = "E";
List<string> result = new List<string>
{
"B name",
"A name",
"E name",
"FE name",
};
result = result.OrderBy(x => x.IndexOf(searchText, StringComparison.OrdinalIgnoreCase)).ThenBy(x=>x).ToList();
你会得到
"E name",
"FE name",
"A name",
"B name",
但如果它不是您所寻找的,那么请像其他答案一样使用StartsWith
。
答案 4 :(得分:1)
我认为这更准确:
result.OrderByDescending(x=>Regex.Split(x.Name, searchText, RegexOptions.IgnoreCase).Count()).ToList();
甚至更好:
result.OrderByDescending(x =>
Regex.Split(x.Name, searchText, RegexOptions.IgnoreCase)
.Sum(el => el.StartsWith(searchText, StringComparison.InvariantCultureIgnoreCase) ? 1 : 0)
).ToList();