2016-09-22 79 views
2

是否存在Linq表達式可以從source list的末尾給出一個謂詞列表。Linq表達式從上一個函數中獲取謂詞項

即:"abc1zxc".ToCharArray().SomeMagicLinq(p=>Char.IsLetter(p));

應該給 「ZXC

+3

的[使用LINQ獲得最後N個可能的複製一個集合的元素?](http://stackoverflow.com/questions/3453274/using-linq-to-get-the-last-n-elements-of-a-collection) –

+0

不完全是,它給出了最後一個N元素,但我問了一個查詢(元素數量未知)。 – Kowalski

+0

哦,對,對不起,我的壞。這將做到:'「abc1zxc」.Reverse()。TakeWhile(c => char.IsLetter(c))。Reverse()'。 –

回答

2

你可以使用這種方法:

var lastLetters = "abc1zxc".Reverse().TakeWhile(Char.IsLetter).Reverse(); 
string lastLettersString = new String(lastLetters.ToArray()); 

不是最有效的方式,但工作和可讀性。

如果你真的需要它作爲一個單一的(優化)方法,你可以這樣做:

public static IEnumerable<TSource> GetLastPart<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate) 
{ 
    var buffer = source as IList<TSource> ?? source.ToList(); 
    var reverseList = new List<TSource>(); 
    for (int i = buffer.Count - 1; i >= 0; i--) 
    { 
     if (!predicate(buffer[i])) break; 
     reverseList.Add(buffer[i]); 
    } 
    for (int i = reverseList.Count - 1; i >= 0; i--) 
    { 
     yield return reverseList[i]; 
    } 
} 

然後,它更簡潔:

string lastLetters = new String("abc1zxc".GetLastPart(Char.IsLetter).ToArray()); 
+0

工作,但使用3 Linq表達式。我要求做一個:( – Kowalski

+0

@Kowalski:它不使用3 [查詢表達式](https://msdn.microsoft.com/en-us/library/bb397676.aspx),但它使用三個LINQ方法,但只有一個表達式(第一行),但是你可以自由地創建一個新的方法,在一次調用中完成所有這些。 –

+0

@Kowalski。添加了一種方法 –