以下是使用 LINQ 实现这一目标的几种方法,同时如果它们以不同于您提供的顺序出现,也可以正确排序值。例如,如果“(avg) Zeta”出现在“Zeta”之前,那么后者在排序后仍应排在第一位。
这是示例列表,重新排序以匹配我上面描述的内容:
var myUnsortedList = new List<string>
{
"Alpha",
"(avg) Alpha",
"(avg) Zeta",
"Zeta",
"Beta",
"(avg) Beta"
};
Lambda 语法
string prefix = "(avg)";
var result = myUnsortedList.Select(s => new
{
Value = s,
Modified = s.Replace(prefix, "").TrimStart(),
HasPrefix = s.StartsWith(prefix)
})
.OrderByDescending(o => o.Modified)
.ThenBy(o => o.HasPrefix)
.Select(o => o.Value);
邮编/聚合
string prefix = "(avg)";
var avg = myUnsortedList.Where(o => o.StartsWith(prefix))
.OrderByDescending(o => o);
var regular = myUnsortedList.Where(o => !o.StartsWith(prefix))
.OrderByDescending(o => o);
var result = regular.Zip(avg, (f, s) => new { First = f, Second = s })
.Aggregate(new List<string>(), (list, o) =>
new List<string>(list) { o.First, o.Second });
查询语法和字符串拆分
这类似于 lambda 语法,只是我没有使用prefix
来确定哪个字符串有前缀。相反,我在一个空间上拆分,如果拆分结果有多个项目,那么我假设它有一个前缀。接下来,我根据值和前缀的可用性进行排序。
var result = from s in myUnsortedList
let split = s.Split(' ')
let hasPrefix = split.Length > 1
let value = hasPrefix ? split[1] : s
orderby value descending, hasPrefix
select s;