C#LINQ OrderBy在子数组上

jw_*_*jw_ 1 c# linq

使用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的精神。

oik*_*ika 5

您可以使用SkipTake实现这一点。

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)