繁体   English   中英

搜索文件,多次出现

[英]Searching a file, multiple occurrences

我的代码仅显示搜索到的字符串的第一个匹配项,我想显示每个匹配项,有人知道我该怎么做吗?

static void Main(string[] args)
{
    string yearInput ; // User input
    // User input

    string[] Year = System.IO.File.ReadAllLines(@"C:\Year.txt");
    string[] Month = System.IO.File.ReadAllLines(@"C:\Month.txt");
    string[] Rain = System.IO.File.ReadAllLines(@"C:\WS1_Rain.txt");

    Console.Write("Enter a Year: ");
    yearInput = Console.ReadLine();

    var yearIndex = Array.FindIndex(Year, year => year == yearInput);

    var outputMonth = Month[yearIndex];// The corresponding Month for the input
    var outputRain = Rain[yearIndex]; // The corresponding rain for the input

    Console.WriteLine("Year:{0}    Month:{1}       Rain:{2}     ",yearInput ,outputMonth, outputRain );
}
}

您可以使用LINQ的Enumerable.Where进行过滤,并使用Enumerable.Zip通过索引连接所有对象:

var years = System.IO.File.ReadLines(@"C:\Users\Josef\Documents\Weather Data\Year.txt");
var months = System.IO.File.ReadLines(@"C:\Users\Josef\Documents\Weather Data\Month.txt");
var rains = System.IO.File.ReadLines(@"C:\Users\Josef\Documents\Weather Data\WS1_Rain.txt");

var yearMonthRainInfos = years
    .Zip(months, (y, m) => new { year = y, month = m })
    .Zip(rains, (x, r) => new { x.year, x.month, rain = r })
    .Where(x => x.year == yearInput);

foreach (var ymrInfo in yearMonthRainInfos)
{
    Console.WriteLine("Year:{0}    Month:{1}       Rain:{2}",
        ymrInfo.year, ymrInfo.month, ymrInfo.rain);
}

请注意,我使用的是ReadLines而不是ReadAllLines ,它不需要先将所有行读取到内存中就可以开始处理。


如果要“如果搜索的年份不存在于该文件中显示一条消息”,最好将查询结果存储在一个集合中,那么该查询结果只能执行一次。 因此,您可以使用ToListToArray

var yearMonthRainList = years
    .Zip(months, (y, m) => new { year = y, month = m })
    .Zip(rains, (x, r) => new { x.year, x.month, rain = r })
    .Where(x => x.year == yearInput)
    .ToList();
if (yearMonthRainList.Count == 0)  // or yearMonthRainList.Any()
{
    MessageBox.Show("The year " + yearInput + "was not found");
}
else
{
    foreach (var ymrInfo in yearMonthRainList)
    {
        Console.WriteLine("Year:{0}    Month:{1}       Rain:{2}",
            ymrInfo.year, ymrInfo.month, ymrInfo.rain);
    }
}

您可以使用Linq来获取所有索引

var matchingYearIndexes = Year.Select((y,i) => new { Year=y, Index=i})
                              .Where(x => x.Year == yearInput)
                              .Select(x => x.Index);

然后循环遍历以获得相应的月份和降雨

foreach(ver index in matchingYearIndexes)
{
    Console.WriteLine(
        "Year:{0}    Month:{1}       Rain:{2}     ",
        yearInput,
        Month[index], 
        Rain[index]);
}

在之后放置一个断点

var yearIndex = Array.FindIndex(Year, year => year == yearInput);

并检查yearIndex的值(如果它是整数),则您应获得1条记录。

如果那是整数数组,则需要循环

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM