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

时间:2015-10-13 18:56:49

标签: c#

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

很多看起来像这样(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 = ...之间的值,然后获得每个唯一的验证" chunk"。

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

这是我的代码:

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为空。

所以我想我的第一个问题是,如何检查以确保仍然存在包含特定&#34;子值的项目时,如何循环List&#34;在这些项目中?

编辑:

我也尝试了这个;

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

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

但它说它无法从string转换为bool

2 个答案:

答案 0 :(得分:1)

你的意思是这样的吗?

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

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

  

我也尝试了这个;

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

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

答案 1 :(得分:0)

一个简单的检查它是否具有所需值

[ERROR] There was an error managing IEDriverServer (latest version) (java.net.UnknownHostException: selenium-release.storage.googleapis.com)
io.github.bonigarcia.wdm.config.WebDriverManagerException: java.net.UnknownHostException: selenium-release.storage.googleapis.com
    at io.github.bonigarcia.wdm.WebDriverManager.getDriversFromXml(WebDriverManager.java:915)
    at io.github.bonigarcia.wdm.managers.InternetExplorerDriverManager.getDriverUrls(InternetExplorerDriverManager.java:92)
    at io.github.bonigarcia.wdm.WebDriverManager.createUrlHandler(WebDriverManager.java:797)
    at io.github.bonigarcia.wdm.WebDriverManager.download(WebDriverManager.java:649)
    at io.github.bonigarcia.wdm.WebDriverManager.manage(WebDriverManager.java:567)
    at io.github.bonigarcia.wdm.WebDriverManager.fallback(WebDriverManager.java:792)
    at io.github.bonigarcia.wdm.WebDriverManager.handleException(WebDriverManager.java:769)
    at io.github.bonigarcia.wdm.WebDriverManager.manage(WebDriverManager.java:573)
    at io.github.bonigarcia.wdm.WebDriverManager.setup(WebDriverManager.java:287)