首页 > 解决方案 > 子数组上的 C# LINQ OrderBy

问题描述

使用 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();

结果是:{"a","d","c","b","e"}

如果没有这个功能,我需要 split/LINQ Orderby/rejoin 这失去了 LINQ 的精神。

标签: c#linq

解决方案


您可以使用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));

你也可以像这样制作一个扩展方法

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));
    }
}
var input = new[] { "a", "b", "c", "d", "e" };

var res = input.OrderRangeByDescending(e => e, 1, 3);

推荐阅读