在列表对象中排序

时间:2015-12-08 09:56:42

标签: c# linq

我从数据库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表达式中更改哪些内容?

5 个答案:

答案 0 :(得分:13)

使用OrderByThenBy

将2个订单链接在一起
.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();