【问题标题】:check if record is last or first in list with linq使用linq检查记录是最后一个还是第一个
【发布时间】:2013-02-04 12:48:51
【问题描述】:

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

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

有什么想法吗?

【问题讨论】:

  • 缺少某些可能会影响答案的上下文。您目前如何返回请求的对象?你的代码是什么样的?您是否已经在列表中搜索该对象?如果有,怎么做?

标签: c# asp.net linq


【解决方案1】:

如果您的对象列表确实是 List,最好明确使用它(改编自 Mehmet Ataş 的回答):

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

这样可以消除 LINQ 开销(虽然不多,但很重要)。但是,您的代码必须使用 List&lt;T&gt; 才能正常工作。

【讨论】:

  • 改编了 Mehmet Ataş 的回答 - 这太没必要了。
  • 我的意思是实施而不是功劳。 First/Last 已经可以 IList 所以用 List&lt;&gt; 实现它是相当多余的。
  • 但是,据我所知,主要的是它是隐含的,因为他们不必枚举集合,因此无法保证通用 IEnumerable
【解决方案2】:

你可以写一个扩展方法比如

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

你可以像这样使用它

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

 bool isFirstOrLast = users.IsFirstOrLast(user);

【讨论】:

  • 不加选择地使用,这可能具有灾难性的性能特征......例如,在循环中调用。
  • 如果第一个/最后一个项目在序列中不明显,也可能导致误报
  • 第一个/最后一个扩展检查 IEnumerable 实例是否为 IList。如果是这样,他们使用list[0]list[list.Count - 1]。但是如果不是IList是的,会有一些开销。另一方面,如果您需要访问集合的某些特定元素,并且选择了不支持按索引访问的集合实现,这将是一个普遍的设计缺陷。
【解决方案3】:
var yourObject = yourList[0];
if(list.Count > 0)
    if(yourObject == list.First() || yourobject == list.Last())
    {
     //item is either first or last
    }

但请记住检查列表是否包含至少 1 个项目,否则您最终会出现 FirstLast 的异常。

上面将比较对象的引用,您可以通过实现自定义IComparable 来比较它们的值,或者您可以比较它们的值。

【讨论】:

  • ...还值得一提的是,在大多数/所有情况下,.Last() 会导致源序列的完整枚举。
  • 如果IEnumerable 确实是ListLast() 将返回list[list.Count-1]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多