如何在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
?
你是说这样吗?
while (lines.Any(x => x.Contains(validationHeader)))
检查validationHeader
是否为列表中任何字符串的一部分。
我也试过这个;
while (lines.Where(stringToCheck => stringToCheck.Contains(validationHeader)))
这不起作用,因为LINQ的Where
方法在您的情况下将返回IEnumerable<string>
。while
循环需要一个布尔谓词。IEnumerable
不能是true
或false
,因此编译器会报错。
检查是否有需要的值
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);
}