正如我在earlier中提到的一个帖子中所提到的,我试图从一个超过8K行的单个方法中解析一些代码段。它主要是数据集中一堆字段的重复,硬编码逻辑。
示例数据我解析看起来像这样;
enctype="multipart/form-data"
从本质上讲,我想做的是在每个"对之间获得所有线路。 temp_str = ds->Fields->FieldsByName("Field1")->AsString;
if (temp_str.IsEmpty())
//do something
else
//do something else
temp_str = ds->Fields-FieldsByName("Field2")->AsString;
if (differentCondition)
//do something
else
//do some other thing
行,然后只收集每组唯一的验证规则。但是我在查找这些代码段时遇到了一些麻烦。
我的方法如下:
temp_str = ...
while (lines.Any(stringToCheck => stringToCheck.Contains(validationHeader)))
{
startOfNextValidation = lines.IndexOf(lines.First(s => s.Contains(validationHeader)), lines.IndexOf(validationHeader) + 1);
if (startOfNextValidation > lines.Count || startOfNextValidation <= 0)
break;
validations.Add(GetString(lines.GetRange(0, startOfNextValidation)));
lines.RemoveRange(0, startOfNextValidation);
}
变量只是string validationHeader
。
这成功识别了我的第一块验证,但它没有找到任何其他内容,这是不正确的。我如何在temp_str = ds->Fields->FieldsByName("
循环的第一行识别validationHeader
的实例时出现了问题,但我似乎无法辨别逻辑错误的位置。
我如何找到&#34;对&#34; while
s然后得到这些对之间的界线?
我看到了这些SO线程但我并不真正理解如何翻译&#39;它是出于我的目的;
答案 0 :(得分:0)
使用此解决方案:
List<string> lines = File.ReadAllLines(file).ToList<string>();
List<string> validations = new List<string>();
List<int> allIndices = lines.Select((s, i) => new { Str = s, Index = i })
.Where(x => x.Str.Contains(validationHeader))
.Select(x => x.Index).ToList<int>();
for (int j = 0; j < allIndices.Count() - 1; j++)
{
int count = (allIndices[j + 1] - allIndices[j]);
validations.Add(GetString(lines.GetRange(allIndices[j], count)));
}
lines
包含file
vaidations
包含我原始问题中定义的validationHeader
之间的代码段
allIndices
只包含每个validationHeader
GetString(List<string>)
只返回一个字符串,其中包含给定范围内的所有元素,然后将其添加到我的validations
列表中,我稍后将其与foreach var v in validations.Distinct()
一起循环并写入{{ 1}}到文件。