8

私 (またはおそらく他の誰か) が、オブジェクトのリストを反復処理し、プロパティのリストと対話する必要があることは珍しくありません。次のように、ネストされたループを使用します。

IList<T> listOfObjects;
IList<TProperty> listOfProperties;

foreach (T dataObject in listOfObjects)
{
    foreach (TProperty property in listOfProperties)
    {
        //do something clever and extremely useful here
    }
}

これは、この問題に対して時間とパフォーマンスがテストされたパターンですか? それとも、よりパフォーマンスが高く、よりエレガントで、単純に楽しいものはありますか (もちろん、読みやすく、保守も容易です)。

上記のコードは私を笑顔にしません。誰かが私のループに喜びをもたらすのを手伝ってくれませんか?

ありがとうございました!

更新: 私は「オタク」という用語を最も肯定的な意味で使用しています。ウィキペディアの定義の一部として、「知的活動を熱心に追求する人を指す」とされています。「コード オタク」とは、プログラマーとして自分自身を継続的に向上させ、速く、保守しやすく、美しいコーディングの新しく斬新でエレガントな方法を見つけることに関心がある人を意味します。彼らは VB6 からの移行を喜んでおり、賢い人々にコードを批評してもらい、自分自身を賢くする手助けをしてもらいたいと考えています。(注: 彼らはまた、-ify で終わる新しい単語を作るのが好きです)。

最後の注意:

Dave R、Earwicker、および TheSoftwareJedi に、Linq の道を歩ませてくれてありがとう。それはまさに私が探していた幸せなコードです!

4

8 に答える 8

8

入れ子になったループに間違いはありません。それらは高速で読みやすく、ソフトウェア開発が最初の赤ちゃんの一歩を踏み出したときから存在しています。

コレクションを反復処理しながらアクションを実行したい場合、LINQ が探索する興味深い方法であることに気付くかもしれません。

http://msdn.microsoft.com/en-us/vcsharp/aa904594.aspx

フレームワークの新しいバージョン (3.5 以降) に限定することになりますが、実際には、関数型プログラミングのアプローチが非常に洗練されていることに気付くかもしれません。この道を進んでいくと、他の言語機能として登場するラムダや匿名メソッドなど、それ自体が魅力的です。

頑張ってください。途中で楽しんでいただければ幸いです-それは素晴らしいアプローチです:)

于 2008-12-13T16:15:26.883 に答える
8

2 つのリストをデカルト結合し、where 句を適用しようとしているようです。これを行うためのLinq構文を示す簡単な例を次に示します。これは、あなたが探しているものだと思います。list1 と list2 は任意の IEnumerable にすることができ、where 句にはより詳細なロジックを含めることができ、select 句では必要なものを取り出すことができます。

        var list1 = Enumerable.Range(1, 100);
        var list2 = Enumerable.Range(1, 100);

        foreach (var item in from a in list1
                             from b in list2
                             where a % b == 0
                             select new { a, b })
        {
            Console.WriteLine(item);
        };

ただし、パフォーマンスは投稿したものと同じになります-その点で誤解を招くことはありません. 私はこのLinq構文を好みます。

于 2008-12-13T17:07:54.543 に答える
5
foreach (var pair in from obj in listOfObjects
                     from prop in listOfProperties  
                     select new {obj, prop})
{
   Console.WriteLine(pair.obj + ", " + pair.prop);
}
于 2008-12-13T16:59:48.043 に答える
3

すべてのオブジェクトとすべてのプロパティで何かをする必要がある場合、やるべきことはそれほど多くありません。構文的に満足できることをいくつか行うことができるかもしれませんが、その作業を回避する方法はありません。

オブジェクトおよび/またはプロパティのサブセットでのみ作業を行っている場合は、それをフィルタリングします (.net 3.5 を実行している場合は、オブジェクトへの linq を使用)!

セット操作を行うためのより良い構文を導入する手段として、セットのFilter/Map/Reduceを楽しむことができます。

于 2008-12-13T16:04:16.830 に答える
0

このようなシナリオでは、関心のある部分をフィルタリングすることから始めることがよくあります。ブロック dosomethingclever() は通常、

foreach (T dataObject in listOfObjects)
{    
  foreach (TProperty property in listOfProperties)    
  {
    if (property.something == "blah") 
    { // OK, we found the piece we're interested in...

      // do something clever...

    }
  }
}

ここで LINQ が役に立ち、ループを select ステートメントに置き換えることができます。もちろん、結果セットを反復処理する必要がある場合もあります。

ここにたくさんのサンプルがあります

于 2008-12-13T16:01:48.033 に答える