使用C#LINQ,我们能否仅对一系列List元素进行OrderBy并将其他元素保留在原位?
例如,输入列表为{“ a”,“ b”,“ c”,“ d”,“ e”},想象的OrderByDescending类似于:
OrderByDescending(delegate d,int start_index,int end_index)
l=l.OrderByDescending(x=>x,1,3).ToList();
Run Code Online (Sandbox Code Playgroud)
结果为:{“ a”,“ d”,“ c”,“ b”,“ e”}
如果没有此功能,我需要拆分/ LINQ Orderby /重新加入,这会失去LINQ的精神。
您可以使用Skip和Take实现这一点。
var input = new[] { "a", "b", "c", "d", "e" };
var res = input.Take(1)
.Concat(input.Skip(1).Take(3).OrderByDescending(e => e))
.Concat(input.Skip(4));
Run Code Online (Sandbox Code Playgroud)
您还可以制作一个扩展方法
public static class IEnumerableExt
{
public static IEnumerable<TSource> OrderRangeByDescending<TSource, TKey>(this IEnumerable<TSource> input, Func<TSource, TKey> keySelector, int from, int length)
{
return input.Take(from)
.Concat(input.Skip(from).Take(length).OrderByDescending(keySelector))
.Concat(input.Skip(from + length));
}
public static IEnumerable<TSource> OrderRangeBy<TSource, TKey>(this IEnumerable<TSource> input, Func<TSource, TKey> keySelector, int from, int length)
{
return input.Take(from)
.Concat(input.Skip(from).Take(length).OrderBy(keySelector))
.Concat(input.Skip(from + length));
}
}
Run Code Online (Sandbox Code Playgroud)
var input = new[] { "a", "b", "c", "d", "e" };
var res = input.OrderRangeByDescending(e => e, 1, 3);
Run Code Online (Sandbox Code Playgroud)