使用linq检查记录是列表中的最后一个还是第一个

Laz*_*ale 3 c# linq asp.net

我有一个对象列表.我想确定用户何时获取列表中第一个或最后一个对象,这样我就可以禁用页面上的某些按钮.

例如,我可能有一些布尔值,如果请求的对象是列表中的最后一个或第一个,那么它将返回true,否则false.

任何的想法?

SWe*_*eko 8

如果您的对象列表确实是a List,那么明确使用它可能会更好(改编为MehmetAtaş的答案):

static class ListExtensions
{
  public static bool IsFirst<T>(this List<T> items, T item)
  {
    if (items.Count == 0)
      return false;
    T first =  items[0];
    return item.Equals(first);
  }

  public static bool IsLast<T>(this List<T> items, T item)
  {
    if (items.Count == 0)
      return false;
    T last =  items[items.Count-1];
    return item.Equals(last);
  }
}
Run Code Online (Sandbox Code Playgroud)

这样你就消除了LINQ开销(它不多,但它很重要).但是,您的代码必须List<T>用于此操作.

  • IList <T>接口也可以正常工作. (2认同)

Meh*_*taş 7

您可以编写扩展方法,例如

public static class IEnumerableExtensions
{
    public static bool IsLast<T>(this IEnumerable<T> items, T item)
    {
        var last =  items.LastOrDefault();
        if (last == null)
            return false;
        return item.Equals(last); // OR Object.ReferenceEquals(last, item)
    }

    public static bool IsFirst<T>(this IEnumerable<T> items, T item)
    {
        var first =  items.FirstOrDefault();
        if (first == null)
            return false;
        return item.Equals(first);
    }

    public static bool IsFirstOrLast<T>(this IEnumerable<T> items, T item)
    {
        return items.IsFirst(item) || items.IsLast(item);
    }
 }
Run Code Online (Sandbox Code Playgroud)

你可以像这样使用它

 IEnumerable<User> users = // something
 User user = // something

 bool isFirstOrLast = users.IsFirstOrLast(user);
Run Code Online (Sandbox Code Playgroud)

  • 如果序列中的第一个/最后一个项目不明显,也可能导致误报 (4认同)
  • 如果不加选择地使用,这可能会带来灾难性的性能特征……例如,在循环中调用。 (3认同)