簡體   English   中英

如何使用linq從列表中刪除尾隨對象?

[英]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;
            }
        }
    }
}

然后,如果你有一個名為lIEnumerable<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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM