使用LINQ删除最后一项

时间:2010-11-12 16:01:12

标签: c# linq

  

可能重复:
  How to take all but the last element in a sequence using LINQ?

看起来像是一个简单的LINQ任务(可能是它),但我无法弄清楚如何使用LINQ删除最后一项序列。使用Take并传递序列的长度 - 1当然可以正常工作。但是,当在一行代码中链接多个LINQ时,这种方法似乎非常不方便。

IEnumerable<T> someList ....

// this works fine
var result = someList.Take(someList.Count() - 1);


// but what if I'm chaining LINQ ?
var result = someList.Where(...).DropLast().Select(...)......;

// Will I have to break this up?
var temp = someList.Where(...);
var result = temp.Take(temp.Count() - 1).Select(...)........;

在Python中,我可以做seq [0:-1]。我尝试将-1传递给Take方法,但它似乎没有做我需要的。

3 个答案:

答案 0 :(得分:60)

对于.NET Core 2+和.NET Standard 2.1 (planned),您可以使用.SkipLast(1)

对于其他平台,您可以编写自己的LINQ查询运算符(即extension method上的IEnumerable<T>),例如:

static IEnumerable<T> SkipLast<T>(this IEnumerable<T> source)
{
    using (var e = source.GetEnumerator())
    {
        if (e.MoveNext())
        {
            for (var value = e.Current; e.MoveNext(); value = e.Current)
            {
                yield return value;
            }
        }
    }
}

xs.Take(xs.Count() - 1)等其他方法不同,上述方法只处理一次序列。

答案 1 :(得分:23)

someList.Reverse().Skip(1).Reverse()

答案 2 :(得分:13)

您可以使用扩展方法轻松完成此操作,使用您已找到的表单,或者TakeCount

的组合
public static IEnumerable<T> DropLast<T>(this IEnumerable<T> enumerable)
{
  return enumerable.Take(enumerable.Count()-1);
}
相关问题