当数据源按名称排序时,如何使用linq从数据源中选取上一条和下一条记录?

ql3eal8s  于 2022-12-06  发布在  其他
关注(0)|答案(3)|浏览(145)

我曾经遇到过这样一种情况,我需要显示匹配记录的上一条和下一条记录,假设我有一个产品的数据源,并且产品是按名称排序的。现在,在按ID检索产品之后,我还想检索下一条和上一条产品,但要按字母顺序。我如何使用LINQ来实现这一点呢?

q3qa4bjr

q3qa4bjr1#

按字母顺序对列表进行排序,找到条目的索引,然后查找索引为+/-1的条目。

list = list.OrderBy( x => x.name ).ToList();
list.IndexOf( entry );
var a = list[entry-1];
var b = list[entry+1];
ryevplcw

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;
        }
    }
}
d7v8vwbk

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 );

相关问题