Untitled

 avatar
unknown
csharp
a year ago
1.7 kB
12
Indexable
// See https://aka.ms/new-console-template for more information

using System.Diagnostics;
using System.Text;

AppDomain.MonitoringIsEnabled = true;
var sp = Stopwatch.StartNew();

var records = new List<Record>();

const Int32 BufferSize = 128;
using (var fileStream = File.OpenRead(@"D:\summary.txt"))
using (var streamReader = new StreamReader(fileStream, Encoding.UTF8, true, BufferSize)) {
    while (streamReader.ReadLine() is { } line)
    {
        records.Add(new Record(line));
    }
}

var summary = from record in records
    group record by record.Id
    into g
    select new
    {
        Id = g.Key,
        Duration = TimeSpan.FromTicks(g.Sum(r => r.Duration.Ticks))
    };

using (var output = File.CreateText(@"D:\result.txt"))
{
    foreach (var entry in summary)
    {
        output.WriteLine($"{entry.Id:D10} {entry.Duration:c}");
    }
}

Console.WriteLine($"Took: {sp.ElapsedMilliseconds:#,#} ms and allocated " +
                  $"{AppDomain.CurrentDomain.MonitoringTotalAllocatedMemorySize / 1024:#,#} kb " +
                  $"with peak working set of {Process.GetCurrentProcess().PeakWorkingSet64 / 1024:#,#} kb");


Console.WriteLine("Press any key to continue...");
Console.ReadKey();

// data class

public class Record
{
    public DateTime Start { get; }
    public DateTime End { get; }
    public long Id { get; }

    public TimeSpan Duration => End - Start;

    public Record(string line)
    {
        var split = line.Split();
        Start = Parse(split[0]);
        End = Parse(split[1]);
        Id = long.Parse(split[2]);
    }

    private static DateTime Parse(string str)
    {
        return DateTime.Parse(str);
    }
}
Editor is loading...
Leave a Comment