[英]How do you remove trailing objects from a list with linq?
我有一個具有屬性的對象集合,我想在LINQ中刪除所有尾隨對象(例如)值為0
。
public class Object
{
public Object(){}
public int Property {get; set;}
}
如果我有一個對象列表:
new Object(){ Property = 1};
new Object(){ Property = 0};
new Object(){ Property = 9};
new Object(){ Property = 7};
new Object(){ Property = 0}; // "trailing zero"
new Object(){ Property = 0}; // "trailing zero"
new Object(){ Property = 0}; // "trailing zero"
如何刪除此列表中的“尾隨零”? 我不想刪除所有屬性為零的屬性,但我想從列表中刪除屬性值為零的任何對象,如果它后面沒有更大的屬性值。
有限大小序列的標准解決方案 - 反向,從開始,反向移除:
var withoutTail = sequence
.Reverse()
.SkipWhile( x => x == 0) // whatever condition you need
.Reverse();
這是非常不理想的,所以如果你真的有真正的集合(即List
),那么從最后一個索引開始刪除項目會更好。
寫一個擴展方法:
static class Extensions
{
public static IEnumerable<T> TrimTrailing<T>(this IEnumerable<T> items,
Predicate<T> test)
{
if (items == null) throw new ArgumentNullException(nameof(items));
if (test == null) throw new ArgumentNullException(nameof(test));
var buf = new List<T>();
foreach (T item in items)
{
if (test(item))
{
buf.Add(item);
}
else
{
foreach (T bufferedItem in buf)
{
yield return bufferedItem;
}
buf.Clear();
yield return item;
}
}
}
}
然后,如果你有一個名為l
的IEnumerable<Object>
,你將使用調用TrimTrailing
var trimmed = l.TrimTrailing(o => o.Property == 0);
但要注意這一點:在最壞的情況下,它會緩沖項目中的所有items
,然后拋棄緩沖區。
只需向后迭代您的列表,刪除任何0
條目,並在列表的開頭或Property != 0
處停止。
for (int i = list.Count - 1; i >= 0; i--)
{
var item = list[i];
if (item.Property == 0)
{
list.RemoveAt(i);
}
else
{
break;
}
}
這將允許您通過列表單次傳遞。
您可以使用FindLastIndex
找到最后非0
指數,並Take
最高的元素。
var result = list.Take(list.FindLastIndex(x => x.Property != 0) + 1);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.