2017-08-15 26 views
0

私はいくつかの列を持つリストを持っています。 Column1 = "AA"のときにブロックのIDを作成する必要があります。前のブロックにIDが含まれている場合は、ID + 1が必要です。フィールドに基づいてリストにIDのブロックを作成する

私はこのようなものがあります:

Column0|Column1| 
23|AA 
23|AA 
23|AX 
23|AX 
23|AX 
23|AA 
23|AA 
23|AX 
23|AA 

をそして、私はこのような何かが必要です。別の言葉で

Column0|Column1|Column2 
23|AA|1 
23|AA|1 
23|AX| 
23|AX| 
23|AX| 
23|AA|2 
23|AA|2 
23|AX| 
23|AA|3 

を、私は(配列に。)のIDを作成したいという情報のブロックを識別するためにColumn1 = AAを含みます。

サイドノート:リストからの注文は、すでに私が必要だったものです。

私はforeachまたはforループを使用する必要がありますか?

(_gDataIDは私のリストです;列の型には私のAAやAXが含まれています...; SeqNumberOfTempCycleは「IDブロック」で設定したい列です)私の考えを適用しようとすると混乱しています。

 int lastseq = 0; 


      for (int i = 0; i < _gDataID.Count; i++) 
      { 

       if (_gDataID[i].Type.ToString() == "AA") 
       { 
        //Does the previous columns has a seq? 
        if (_gDataID[i-1].SeqNumberOfTempCycle.ToString() == null) 
        {       
         _gDataID[i].SeqNumberOfTempCycle = lastseq + 1; 
         lastseq = lastseq + 1; 

        } 
        else 
        { 
         _gDataID[i].SeqNumberOfTempCycle = lastseq; 

        } 
       } 

      } 

私のアイデアはうまくいきません。まず、私はこれを行うことはできません:

_gDataID[i].SeqNumberOfTempCycle = lastseq + 1; 

私のforループはルーピングではなく、フィールドを正しく設定しています。

+0

あなたは、リストを反復処理し、文字列の現在のseqnumberを保つことができる(例えば、「AA」)と、新しいブロックに遭遇するたびに、あなたがのために現在のseqnumberをインクリメント対応する文字列。 – user2971569

答えて

1

私が正しく理解している場合は、トークンのシーケンスの間にギャップがある場合は、カウンターを更新する必要があります。その場合には、使用辞書は、以前に遭遇したトークンを覚えておくこと:

Dictionary<string, int> tokens = new Dictionary<string, int>(); 
int i = 0; 
while(i < gDataID.Count) 
{ 
    string dataToken = gDataID[i].Type.ToString(); 
    if(!tokens.ContainsKey(dataToken) 
    { 
    tokens.Add(dataToken, 0); 
    } 
    tokens[dataToken]++; 

    While(i < gDataID.Count && gDataID[i].Type.ToString() == dataToken) 
    { 
     gDataID[i].SeqNumberOfTempCycle = tokens[dataToken]; 
     i++; 
    } 
}