2016-04-18 2 views
-1

В коде я показываю только первое вхождение искомой строки, я хотел бы показать каждое событие, знает ли кто-нибудь, как я могу это сделать?Поиск файла, множественные вхождения

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); 

    } 

    } 
+0

Но ваши строки содержат также другой текст или только год/моль/значение дождя? И неясно, какова связь между файлом года и файлом месяца/дождя – Steve

+0

В файлах? Они содержат только значения (1 на каждой строке). – Jermaneeeee

+0

. Существует перегрузка 'Array.FindIndex', которая принимает начальный индекс. Вы можете использовать это, чтобы начать поиск следующего после предыдущего, найденного в цикле. – juharr

ответ

3

Вы можете использовать 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); 
    } 
} 
+0

Есть ли в любом случае, чтобы сообщение появилось, если год, который они ищут, не существует в этом файле? – Jermaneeeee

+0

@Jermaneeeee: конечно, вы можете использовать 'yearMonthRainInfos.ToList()', чтобы получить список, сохранить его в переменной. Затем вы можете проверить, является ли свойство 'Count'' '0'. –

+0

Им очень жаль беспокоить вас, но по какой-то причине я борется за то, как на самом деле реализовать то, что вы мне сказали ...... так жаль. – Jermaneeeee

1

Вы можете использовать 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]); 
} 
-1

поставил точку останова после

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

и проверить значение yearIndex , если это целое число, и должны получить 1 запись.

, если это массив целых чисел, и необходимо, чтобы петля

+0

'Array.FindIndex' возвращает' int', а не массив. – juharr

+0

О, я только что заметил свою «глупую» ошибку :( – Srinika

+0

Не могли бы вы показать мне, как это сделать? – Jermaneeeee

Смежные вопросы