一种选择是创建一个可在您的 linq 表达式中使用的扩展方法。以下解决方案就是这样做的。我也让它适用于多个匹配的情况。
下面的示例代码将具有以下输出:
6:Galvin
1:Angie
2:Bret
4:cunnighma
8:Desmond
5:maria
7:Newton
3:Salva
代码如下:
void Main()
{
// Setup the example data
var names = new List<Record>
{
new Record { Id = 1, Name = "Angie" },
new Record { Id = 2, Name = "Bret" },
new Record { Id = 3, Name = "Salva" },
new Record { Id = 4, Name = "cunnighma" },
new Record { Id = 5, Name = "maria" },
new Record { Id = 6, Name = "Galvin" },
new Record { Id = 7, Name = "Newton" },
new Record { Id = 8, Name = "Desmond" }
};
// Sort the list and move the matches to the top
var result = names
.OrderBy(x => x.Name)
.MoveToTop(x => x.Name.Contains("alvin"));
// Display the results to the console
result
.ToList()
.ForEach(x => Console.WriteLine($"{x.Id}:{x.Name}"));
}
public class Record
{
public int Id { get; set; }
public string Name { get; set; }
}
public static class EnumerableExtensions
{
public static IEnumerable<T> MoveToTop<T>(this IEnumerable<T> list, Func<T, bool> predicate)
{
var matches = list.Where(predicate);
return matches.Concat(list.Except(matches));
}
}