2009-05-16 6 views

答えて

5

デフォルトでは方法はありませんが、少し簡単に拡張メソッドを追加するのは難しくありません。私はいくつかのエラーチェックを除いて、彼らが簡潔さのために同じ長さであることを確認した。

public static void ForEachPair<T1,T2>(
    this IEnumerable<T1> source1, 
    IEnumerable<T2> source2, 
    Action<T1,T2> del) { 
    using (var e1 = source1.GetEnumerator()) 
    using (var e2 = source2.GetEnumerator()) { 
    while (e1.MoveNext() && e2.MoveNext()) { 
     del(e1.Current, e2.Current); 
    } 
    } 
} 

今、あなたは以下の

var list = GetSomeList(); 
var otherList = GetSomeOtherList(); 
list.ForEachPair(otherList, (x,y) => 
{ 
    // Loop code here 
}); 
+0

IMO、あなたはそれを正しく持っています、Zipは何か異なっています。 – leppie

+0

@ジャレッド:私はあなたの "if"を "while"とすることを意味したと思います。 @leppie:これは、実行するデリゲートを渡すのではなく、IEnumerable(あなたはforeachで動作することができます)として結果を提供する以外、 "Zip"とはどのように違うのですか? –

+0

便利な小さな機能があります。小さな提案:usingステートメントをネストする必要はありません。 – Noldorin

6

.NET 4.0の新しいZip機能が必要だと思います。 Eric Lippert blogged about it recentlyと実装の単純な形式が含まれています。

また、MoreLINQZip.csにあります。これは、シーケンスが同じ長さでない場合、さまざまなオプションを可能にします。 "デフォルト"は.NET 4.0のように動作し、いずれかのシーケンスに要素がなくなると停止します。代わりに、より短いシーケンスを埋め込むか、例外をスローします。

+0

権利を行うことができ、それは私がそれを果たしていることが一週間かそこらのために、私は本当にPythonの約気に入っものの一つであったことはジップが内蔵されていることでした関数では、ループの伝統が必要だったケースはほとんどなく、伝統的なforループの動作を得るためにミニハックを行う必要があることを強調しました。それをintにしようとしてうれしいC#4 – Davy8

関連する問題