写出列表的特定行

时间:2015-06-02 15:04:05

标签: c# if-statement file-io console

我有一个大文件,我把这个文件分成两组:A和B.下面是文件中每一行的示例:

 5/21/2015 11:55:56 PM | Batch 6|386/767|50.33 %|CH2M-R|Processed NXRMN5...Checking refundable and non-refundable fares. Traditional Booking. Inside ticketing window. Minimum Savings Required: $131.00. Actual Savings: $257.18. Savings found: $257.18 (11.55 %). Savings were previously found.

简而言之,我正在编写一个程序来查看A组和B组,如果一条线有"找到了储蓄:"它会写出那条线。此外,如果该文件具有30%或更高的节省,它将写出该行并在前面放置1个星号,如果它节省了30%或更多以及500美元或更高,它将写出2个星号。为了澄清,257.18是找到的节省量,并且该数字旁边的百分比是必须找到的百分比。

这是我到目前为止的if语句,我只需要在if语句中包含的代码:

if (a.Any(item => item.Contains("Savings found:"))
{

}

我是c#的新手,我不知道如何让控制台编写具有这些要求的特定代码行。任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:2)

我认为我们在这里帮助学校计划。昨天有几个问题涉及几乎完全相同的问题和数据。

同时,由于您希望迭代结果集以查找确切的节省,我建议使用以下内容,而不是使用" if"。使用" Where"查询将与" Any"相同,但会返回一个集合,而不是布尔值。直接进入" foreach"将有助于节省一步。

var find = "Savings found:";

foreach(var line in a.Where(w => w.Contains(find))
{
  var subStr = line.Substring(0, line.IndexOf(find)+find.Length);
  var startIndex = subStr.IndexOf('(');
  var endIndex = subStr.IndexOf(')');

  var savings = double.Parse(subStr.SubString(0, startIndex-1).Trim());
  var percent = double.Parse(subStr.SubString(startIndex+1, endIndex-startIndex-2).Trim());

  Console.WriteLine("{0}{1}{2}", (percent >= 30) ? "*" : string.Empty,
                                 (percent >= 30 && savings >= 500) ? "*" : string.Empty,
                                 line);
} 

从这里你可以解析行数据以找到节省的成本,你可以写出你需要的任何数据。

解析字符串基本上只是将字符串数据分成不同的部分以尝试获取所需的数据。但是,由于您只是在查找百分比,请查看上面的代码以获取更多示例

答案 1 :(得分:1)

Any方法只会告诉您集合中的任何一个项目是否与提供的条件相符。

您可以使用Foreach更好地循环项目:

a.ForEach(item => { if (item.Contains("Savings found:")) { Console.WriteLine(item); } });

这将检查a中的每个项目。如果项目包含字符串Savings found:,它将在控制台上打印该项目。

答案 2 :(得分:1)

暂时没有做太多C#,但假设你只想写入控制台,例如:

foreach (string myLine in A)
{
       if (myLine.Contains("Savings found:") == true)
       {
            Console.WriteLine(myLine);
       }
       if...(further code to deal with 30%+ savings, etc...)
       {
            Console.WriteLine("*" + myLine);
       }
       .....
       ...
}