2011-01-11 2 views

答えて

24

あなたはこのような何かを行うことができます:

IEnumerable<Person> persons = .. 

var firstPersonAfterJack = persons.SkipWhile(p => p.Name != "Jack") 
            .ElementAt(1); //Zero-indexed, means second 

アイデアは、あなたが条件を満たしまでの要素をスキップして結果のシーケンスを生成することで、その後、その配列の第二の要素を取ります。

クエリが結果を返すという保証は(例えば一致するものが見つからない、またはシーケンスの最後の要素であるん)がない場合は、あなたがElementAtOrDefaultElementAtを交換して、チェックするためにnull検定を行うことができます成功/失敗。

あなたの質問には、の注文番号人がいることがわかりました。その意味をより詳しく説明できれば、より良い答えが得られるかもしれません(例えば、シーケンスを線形検索する必要がないかもしれません)。

+0

ちょうど私にそれを打つ:-) – finnw

+0

@finnw:我々は同じプロパティ名を選んだ。私たちが同じ人名を選んだのかどうかを想像してみてください。 :) – Ani

+0

これは、一般的なLinq to Objectクエリの素晴らしい解決策ですが、 'SkipWhile'クエリ演算子はLinq to Sqlではサポートされていません。 –

3

SkipWhileは、述語を取り、述語が偽になるまですべてをスキップする方法です。その要素とそれ以降のすべてを返します。 isThePerson

var remainingPeople = collectionOfPeople.SkipWhile(p => !isThePerson(p)); 
if (remainingPeople.Count() == 1) 
{ 
    // the person was the last in the list. 
} 
var nextPerson = remainingPeople.Skip(1).First(); 

は、人を取り、それはあなたがそれ興味を持っている人であればtrueを返すメソッドです。

+0

ここに2つの問題があります:1)*全体*ソースシーケンスの冗長列挙があります。 2) 'remainingPeople.Count()== 0 '、つまり条件が決して満たされないときには失敗します。 – Ani

+0

1)シーケンス全体を2回列挙する場所がわかりません。どこを指摘できますか? 2)それがリストに含まれていない場合には失敗するが、要件にはその人がリストに含まれることが保証されているので問題はない。 –

+1

ほとんどのLINQ演算子は遅延実行を使用することに注意してください。 'remainingPeople'は*クエリ*であり、リストや配列ではありません。結果は2回、 'Count()'と 'Skip(1).First()'に対して1回ずつ取得されます。 – Ani

関連する問題