2011-08-02 32 views
0

内のノード間の要素のカウント数Iは、STLアルゴリズムSTDと同様System.Collections.Generic.LinkedListに開始ノードと終了ノードとの間のノードの合計数を計算します。 :C++でをカウントします(ただし、カウントにエンドノードを含めるつもりはありません)。C番号:LinkedListの

私は把握できませんでした。 「mustn、

var counter = 1; 
var node = iStartNode; 
while (!ReferenceEquals(node, iEndNode)) 
{ 
    node = node.Next; 
    ++counter; 
} 

しかし、より効率的なソリューションが存在しなければならない:どのように効率的にこの数を計算するために、任意のLINQの拡張メソッドを使用するので、私は(すべてヌルとの整合性チェックを除く)は、このようなカウンタを実装していますそこに?どんな提案も高く評価されます。

+0

もっと効率的なソリューションが必要な理由は何でしょうか? –

+0

おそらく、_efficient_の代わりに_compact_という単語を使用していたはずです。パフォーマンスの観点からは、おそらく上記の解決策はOKですか? –

+0

パフォーマンスの観点からは、問題ありません。あなたが他の場所で役に立つかもしれないいくつかの拡張メソッドを持っていれば、よりコンパクトな表現について私の答えを見てください。 –

答えて

6

あなたのソリューションは、最も効率的で読みやすいと思っています。 LINQで実装を見つけることができても、それは確かに曲がりくねっています。

nullを除外すると、実際のコードがnodeのリストを終了して実行されても、実際のコードがスローされないことを意味します。私はこれを考えることができ

+0

あなたの答えはDavidにありがとう。実際には、リストの終わりからコントロールされた方法で実行されるようにメソッドを実装しました。開始ノードと終了ノードの両方が同じリンクリストに含まれていることと、開始​​ノードが終了ノードの前に表示されていることを確認します。しかし、それはおそらく別の話です... –

4

唯一の方法は、わずかクリーナーかもしれない - あるいは少なくとも、ノード少しクリーナーリンクリストでの作業の一般的なコードを作る - 2つの拡張メソッドの書き込みを次のようになります。

static IEnumerable<LinkedListNode<T>> AsEnumerable<T> 
    (this LinkedListNode<T> node) 
{ 
    // Can even call list.Head.AsEnumerable() when the list is empty! 
    while (node != null) 
    { 
     yield return node; 
     node = node.Next; 
    } 
} 

static IEnumerable<LinkedListNode<T>> ReverseEnumerable<T> 
    (this LinkedListNode<T> node) 
{ 
    while (node != null) 
    { 
     yield return node; 
     node = node.Previous; 
    } 
} 

そして、あなたはLINQを使用することができます:あなたは1で、それをインクリメントする場合がありますので、endNode自体は含まれません

var count = node.AsEnumerable().TakeWhile(x => x != endNode).Count(); 

(を持っていいだろうとSkipUntilTakeWhileSkipWhileのようだったが、取るか、またはスキップする最後の一人として最初の述語一致しないノードが含まれていた方法。)

注それを見つけることができなかった場合は、このはビッグバン行かないだろうということendNode - これは、開始ノードからのリストのカウントだけを与えます。

拡張メソッドの素晴らしい点は、基本的にはリストから任意のポイントからシーケンスとして操作できることです。

+0

この面白い答えのジョンに感謝します。実際にReverseEnumerableメソッドを使用しているのを見ることができません。 TakeUntil/SkipUntilメソッドに対するあなたのコメントにはっきりと同意します。私は当初、フレームワークで何か類似のものを探していましたが、何も見つけられなかったので、私は上に概説した解決策に戻りました。 –

+0

@アンダー:まったく。あなたが二重リンクリストを持っているとすれば、私は最初の拡張メソッドを2番目に入れないでしょう:) –

+0

+1私が見た最も厄介なLinqクエリの1つです! ;-) –