看起来像是一个简单的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(...)........;
Run Code Online (Sandbox Code Playgroud)
在Python中,我可以做seq [0:-1].我尝试将-1传递给Take方法,但它似乎没有做我需要的东西.
sta*_*ica 62
对于.NET Core 2+和.NET Standard 2.1(计划),您可以使用.SkipLast(1)
.
对于其他平台,您可以编写自己的LINQ查询操作符(也就是一个扩展方法上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;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
与其他方法不同xs.Take(xs.Count() - 1)
,上述方法仅处理序列一次.
Sae*_*iri 23
someList.Reverse().Skip(1).Reverse()
Run Code Online (Sandbox Code Playgroud)
Jam*_*iec 13
您可以使用扩展方法轻松完成此操作,可以使用您已经找到的表单,也可以使用Take
和的组合Count
public static IEnumerable<T> DropLast<T>(this IEnumerable<T> enumerable)
{
return enumerable.Take(enumerable.Count()-1);
}
Run Code Online (Sandbox Code Playgroud)