Sha*_*der 5 .net c# linq sorting c#-4.0
我想按字词排序C#列表.假设我有一个C#列表(对象),其中包含以下单词:
[{id:1, name: "ABC"},
{id:2, name: "XXX"},
{id:3, name: "Mille"},
{id:4, name: "YYY"},
{id:5, name: "Mill",
{id:6, name: "Millen"},
{id:7, name: "OOO"},
{id:8, name: "GGGG"},
{id:9, name: null},
{id:10, name: "XXX"},
{id:11, name: "mil"}]
Run Code Online (Sandbox Code Playgroud)
如果用户Mil作为搜索键传递,我想返回以搜索键开头的所有单词,然后返回与条件不匹配的所有单词并按字母顺序排序.
我能想到的最简单的方法是在结果集上运行for循环,将所有以search键开头的单词放入一个列表中,并将重命名的单词放入另一个列表中.对第二个列表进行排序,然后将它们组合在一起以返回结果.
我想知道是否有更聪明或内置的方式来获得理想的结果.
当然!您将按匹配的顺序排序,然后按名称排序,如下所示:
var results = objects.OrderByDescending(o => o.Name.StartsWith(searchKey))
.ThenBy(o => o.Name);
Run Code Online (Sandbox Code Playgroud)
请注意,在排序false之前true,您需要使用OrderByDescending.
正如AlexD指出的那样,名称可以为null.你必须决定如何对待这个.最简单的方法是使用o.Name?.StartsWith(searchKey) ?? false,但您必须根据您的需要做出决定.此外,并非所有Linq场景都支持空传播(想到Linq To Entities).
这应该做到,但可能有更快的方式,也许以GroupBy某种方式使用.
var sorted = collection
.Where(x => x.Name.StartsWith(criteria))
.OrderBy(x => x.Name)
.Concat(collection
.Where(x => !x.Name.StartsWith(criteria))
.OrderBy(x => x.Name))
Run Code Online (Sandbox Code Playgroud)
你可以尝试GroupBy这样:
var sorted = collection
.GroupBy(item => item.Name.StartsWith(criteria))
.OrderByDescending(chunk => chunk.Key)
.SelectMany(chunk => chunk
.OrderBy(item => item.Name));
Run Code Online (Sandbox Code Playgroud)