private void EnsureSorted() { var timer = Stopwatch.StartNew(); using var reader = new DataRecordReader(_options.Sorted); var charBuffer = new char[Constants.ValueMaxLength]; var counter = new Counter(); var fileLength = reader.Length; var readerPositionPrev = 0L; var repeatsCount = 0L; var dataRecordPrev = new DataRecord(long.MinValue, ReadOnlySpan <char> .Empty); foreach (var dataRecord in reader) { if (dataRecordPrev.CompareTo(dataRecord) == 1) { Console.WriteLine($"Not sorted data in line {counter.LinesCount}"); return; } var readerPosition = reader.Position; if (readerPosition - readerPositionPrev > Constants.HundredMegabytes) { ShowProgress(readerPosition, fileLength, timer.Elapsed.TotalSeconds); readerPositionPrev = readerPosition; } if (dataRecordPrev.Value.Equals(dataRecord.Value, Constants.ValueComparison)) { repeatsCount++; } counter.SetMinMax(dataRecord.Number); counter.IncrementLineCount(); dataRecordPrev = dataRecord.Copy(charBuffer); } Console.WriteLine(); Console.WriteLine("Data is really sorted"); Console.WriteLine($"Numbers between {counter.MinNumber} and {counter.MaxNumber}"); Console.WriteLine($"Lines count {counter.LinesCount}"); Console.WriteLine($"Repeats count {repeatsCount}"); }
private void CompareWithSource() { var timer = Stopwatch.StartNew(); var sortedData = new Dictionary <string, List <long> >(); using (var sortedReader = new DataRecordReader(_options.Sorted)) { foreach (var sortedRecord in sortedReader) { var key = new string(sortedRecord.Value); if (!sortedData.TryGetValue(key, out var collection)) { collection = new List <long>(); sortedData.Add(key, collection); } collection.Add(sortedRecord.Number); } } Console.WriteLine("Read sorted records complete"); using (var sourceReader = new DataRecordReader(_options.Source)) { foreach (var(expectedNumber, value) in sourceReader) { var expectedKey = new string(value); if (!sortedData.TryGetValue(expectedKey, out var actualNumbers)) { Console.WriteLine($"Not found value '{expectedKey}' in sorted file"); return; } if (actualNumbers.Contains(expectedNumber)) { continue; } Console.WriteLine($"Not found number {expectedNumber} of value '{expectedKey}' in sorted file"); return; } } Console.WriteLine($"All lines from source file exists in sorted file"); Console.WriteLine($"Compare complete at {timer.Elapsed}"); }