我有一个包含多个列的列表。当我的Column1 =“AA”时,我需要为块创建一个ID。如果前一个块包含ID,我应该有ID + 1。
我有这样的事情:
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(在seq。中)以识别包含Column1 = AA的信息块。
旁注:列表中的订单已经是我需要的订单。
那么,我应该使用foreach还是循环?当我尝试应用我的想法时,我感到困惑:
(_ 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 :(得分:1)
如果我理解正确,如果令牌序列之间存在间隙,则需要更新计数器。在这种情况下,使用Dictionary来记住以前遇到的令牌:
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++;
}
}