c# - 子数组上的 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 的精神。
解决方案
您可以使用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));
你也可以像这样制作一个扩展方法
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);
推荐阅读
- react-native - 在另一个正在播放时停止 web 视图中的媒体播放器
- docker - 带有卷挂载的 docker 容器中的文件权限
- python - 我想制作一个程序,从用户那里获取文件名并显示文件的绝对路径
- python - 从python中的一组链接中提取数字
- gnuradio - GNU Radio Companion 触发信号
- java - 项目中的类路径变量“JRE_LIB”已弃用:改用 JRE 系统库
- ios - 在ios中的Objective c中集成Swift库“在类型对象上找不到属性”
- ios - 从 cellForRowAt 移除开关
- java - 错误:无法从静态上下文引用非静态变量 super >>但我使用静态关键字
- angular - Angular 服务工厂模式