[英]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
,它不需要先将所有行读取到内存中就可以开始处理。
如果要“如果搜索的年份不存在于该文件中则显示一条消息”,最好将查询结果存储在一个集合中,那么该查询结果只能执行一次。 因此,您可以使用ToList
或ToArray
:
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.