如何在List的内容包含子值时遍历List

本文关键字:List 遍历 包含 | 更新日期: 2023-09-27 18:17:35

我试图解析出这个单一的方法,它有超过8000行硬编码的数据验证。其中大多数是相同的,重复的逻辑,用于数据源中的不同字段。

大部分看起来像这样(c++):

temp_str = _enrollment->Fields->FieldByName("ID")->AsString.SubString(1,2);
if (temp_str.IsEmpty())
    { /* do stuff */ }
else
{
  if (!IsDigitsOnly(temp_str))
      { /* do different stuff */ }
  else
      { /* do other stuff */ }
}
temp_str = _enrollment->Fields->FieldByName("OtherField");
if (temp_str.IsEmpty())
    /* do more stuff */

所以基本上,我只需要解析出每对temp_str = ...之间的值,然后获得每个唯一的验证"块"。

我目前遇到的问题是确定每个"块"的开始和结束位置。

这是我的代码:

static void Main(string[] args)
{
    string file = @"C:'somePathToFile.h";
    string validationHeader = "temp_str = _enrollment->Fields->FieldByName(";
    string outputHeader = "=====================================================";
    int startOfNextValidation;
    List<string> lines = File.ReadAllLines(file).ToList<string>();
    List<string> validations = new List<string>();
    while (lines.Contains(validationHeader))
    {
        //lines[0] should be the "beginning" temp_str assignment of the validation
        //lines[startOfNextValidation] should be the next temp_str assignment
        startOfNextValidation = lines.IndexOf(validationHeader, lines.IndexOf(validationHeader) + 1);
        //add the lines within that range to another collection
        //  to be iterated over and written to a textfile later
        validations.Add((lines[0] + lines[startOfNextValidation]).ToString());
        //remove everything up to startOfNextValidation so we can eventually exit
        lines.RemoveRange(0, startOfNextValidation);
    }
    StreamWriter sw = File.CreateText(@"C:'someOtherPathToFile.txt");
    foreach (var v in validations.Distinct())
    {
        sw.WriteLine(v);
        sw.WriteLine(outputHeader);
    }
    sw.Close();
}

我的while语句从未被击中,它只是立即跳转到StreamWriter创建,这创建了一个空文本文件,因为validations是空的。

所以我想我的第一个问题是,你如何循环一个List,同时检查,以确保仍然有项目包含一个特定的"子值"在这些项目?

编辑:

我也试过这个;

while (lines.Where(stringToCheck => stringToCheck.Contains(validationHeader)))

根据这个答案;https://stackoverflow.com/a/18767402/1189566

但是它说它不能从string转换为bool ?

如何在List的内容包含子值时遍历List

你是说这样吗?

while (lines.Any(x => x.Contains(validationHeader)))

检查validationHeader是否为列表中任何字符串的一部分。

我也试过这个;

while (lines.Where(stringToCheck => stringToCheck.Contains(validationHeader)))

这不起作用,因为LINQ的Where方法在您的情况下将返回IEnumerable<string>while循环需要一个布尔谓词。IEnumerable不能是truefalse,因此编译器会报错。

检查是否有需要的值

foreach (var setting in FullList)
{
    if(cleanList.Exists(x => x.ProcedureName == setting.ProcedureName)) 
       setting.IsActive = true; // do you business logic here 
    else
       setting.IsActive = false;
    updateList.Add(setting);
}