我曾经遇到过这样一种情况,我需要显示匹配记录的上一条和下一条记录,假设我有一个产品的数据源,并且产品是按名称排序的。现在,在按ID检索产品之后,我还想检索下一条和上一条产品,但要按字母顺序。我如何使用LINQ来实现这一点呢?
q3qa4bjr1#
按字母顺序对列表进行排序,找到条目的索引,然后查找索引为+/-1的条目。
list = list.OrderBy( x => x.name ).ToList(); list.IndexOf( entry ); var a = list[entry-1]; var b = list[entry+1];
ryevplcw2#
一个有效的非LINQ答案,假设序列是预先排序的。
public static IEnumerable<T> Beside<T>( this IEnumerable<T> source, T target, IEqualityComparer<T> comparer = default) { comparer ??= EqualityComparer<T>.Default; ArgumentNullException.ThrowIfNull(target); T previous = default; bool found = false; foreach(T item in source) { if (found) { yield return item; break; } if (comparer.Equals(item, target)) { found = true; yield return previous; } else { previous = item; } } }
d7v8vwbk3#
更有效的方法,而无需对列表进行排序:
var a = list.Where( x => x.name < entry ).Max( x => x.name ); var b = list.Where( x => x.name > entry ).Min( x => x.name );
3条答案
按热度按时间q3qa4bjr1#
按字母顺序对列表进行排序,找到条目的索引,然后查找索引为+/-1的条目。
ryevplcw2#
一个有效的非LINQ答案,假设序列是预先排序的。
d7v8vwbk3#
更有效的方法,而无需对列表进行排序: