0

コレクションをループしているときに、現在のアイテムの位置をどのように判断できますか?

私は各クライアントごとにグループ化された決定データを処理していますが、レコードの他のプロパティと組み合わせて、セット内の「位置」、つまり 1 番目、2 番目、3 番目などに依存するいくつかのビジネス ロジックがあります。クライアントに関する 3 回目の決定であり、インスタンスでの評価が A の場合 ...

var multiples = from d in context.Decision_Data
                group d by d.Client_No
                    into c
                    where c.Count() > 1
                    select c;

foreach (var grouping in multiples)
{
    foreach (var item in grouping)
    {
        // business logic here for processing each decision for a Client_No
        // BUT depends on item position ... 1st, 2nd, etc.
    }

更新:カウンターを入れて手動でインクリメントできることを感謝しますが、それは間違っていると感じ、これを処理するために.NETに何かがあると思いましたか??

4

4 に答える 4

4

このようなもの:

foreach (var grouping in multiples)
{
    foreach (var x in grouping.Select(index,item) => new {index, item})
    {
        // x.index is the position of the item in this group
        // x.item is the item itself
    }
}

補足: LINQ クエリの実装をもう少し効率的にすることができます。Count() > 1とにかく foreach で行う可能性が高い、各グループを完全に列挙します。代わりに を使用できますSkip(1).Any()。これは、2 つのアイテムが見つかるとすぐにグループの反復を停止します。明らかに、これは(非常に)大きな入力リストの場合にのみ実際の違いを生むでしょう。

var multiples = from d in context.Decision_Data
                group d by d.Client_No
                    into c
                    where c.Skip(1).Any() 
                    select c;
于 2012-07-25T09:30:58.820 に答える
3

標準で提供されるものは何もありませんforeach。外部カウントを維持するだけです。

Enumerable.Select現在のアイテムのインデックスを提供する拡張メソッドにオーバーロードがあります。

http://msdn.microsoft.com/en-us/library/bb534869

しかし、あなたのコードが何をしようとしているのかを知らなければ、foreach実際にそれを使用する例を提供することはできません. 理論的には、インデックスが保存されている匿名型を投影し、後でそれをforeach. jeroenhの答えはこのルートをたどったようです。

于 2012-07-25T09:14:14.943 に答える
0

意思決定の順序について確実性を得る方法がわかりません。あなたのデータは長期的なデータソース(データベースなど)からのものであり、特に「グループに"。

エンティティに「順序」フィールド (または列) をDecision追加して、意思決定をデータ ソースに追加するときに設定される意思決定の順序を追跡します。そうすれば、ビジネス ロジックでこのフィールドを直接使用できます。

意思決定の順序を追跡するには多くの方法があるはずですが、それがなければ、それらがどの順序で行われたかを確認することさえできません。

于 2012-07-25T09:33:43.487 に答える
0

Adam が述べたように、Adams ソリューションを使用するかToList()、クエリで実行できるようにすることができます

multiples.IndexOf(grouping)
于 2012-07-25T09:14:20.217 に答える