I have the following code which is butt ugly and I would like to rewrite it with some nice LINQ but I can't figure it out:
var folders = new List<string>();
string folderResult = "";
foreach (var parallelMeasurement in ParallelMeasurements)
{
var folder = parallelMeasurement.Item1.Substring(0, parallelMeasurement.Item1.IndexOf("."));
if (!folders.Contains(folder))
{
folders.Add(folder);
folderResult += folder + ",";
}
}
folderResult = folderResult.TrimEnd(',');
string valueResult = "";
foreach (var folder in folders)
{
var views = ParallelMeasurements.Where(x => x.Item1.Substring(0, x.Item1.IndexOf(".")) == folder);
var value = views.Sum(x => x.Item2.TotalSeconds);
valueResult += value + ",";
}
valueResult = valueResult.TrimEnd(',');
File.WriteAllText(Paths.ParallelGroupedTrend, $"{folderResult}{Environment.NewLine}{valueResult}");
ParallelMeasurements
is List<Tuple<string, TimeSpan>>
and the contents of the tuple.Item1 is for example:
Actor.ActorUsers
Actor.ActorInformation
User.Edit
So in short, I want to aggregate the measurements based on the first part of the string, the contents before the period.
This should do?
ParallelMeasurements.Add(new Tuple<string, TimeSpan>("Actor.ActorUsers", TimeSpan.FromMilliseconds(150)));
ParallelMeasurements.Add(new Tuple<string, TimeSpan>("Actor.ActorInformation", TimeSpan.FromMilliseconds(200)));
ParallelMeasurements.Add(new Tuple<string, TimeSpan>("User.Edit", TimeSpan.FromMilliseconds(150)));
var folders =
ParallelMeasurements
.GroupBy(g => g.Item1.Substring(0, g.Item1.IndexOf(".", StringComparison.InvariantCulture)))
.Select(s => new { Group = s.Key, Sum = s.Sum(a => a.Item2.Milliseconds) })
.ToList();
var folderResult = string.Join(",", folders.Select(f => f.Group));
var valueResult = string.Join(",", folders.Select(f => f.Sum));
Console.WriteLine("{0}{1}{2}", folderResult, Environment.NewLine, valueResult);
Prints out
Actor,User
350,150
Like so:
var folders = new List<string>();
foreach (var parallelMeasurement in ParallelMeasurements)
{
folders.Add(parallelMeasurement.Item1.Substring(0, parallelMeasurement.Item1.IndexOf(".")));
}
string folderResult = String.Join(',', folders.Disctint().toList());
var values = new List<int>();
foreach (var folder in folders)
{
values.Add(ParallelMeasurements.Where(x => x.Item1.Substring(0, x.Item1.IndexOf(".")) == folder).Sum(x => x.Item2.TotalSeconds));
}
string valueResult = String.Join(',', values);
LINQ-able? Yes. Less ugly? Debatable!
List<string> folders = new List<string>();
string folderResult = string.Join(",", ParallelMeasurements
.Select(parallelMeasurement => parallelMeasurement.Item1.Substring(0, parallelMeasurement.Item1.IndexOf(".")))
.Where(folder => folders.Contains(folder))
.Select(folder =>
{
folders.Add(folder);
return folder;
}));
string valueResult = string.Join(",", folders
.Select(folder => ParallelMeasurements
.Where(parallelMeasurement => parallelMeasurement.Item1.Substring(0, parallelMeasurement.Item1.IndexOf(".")) == folder))
.Select(views => views.Sum(view => view.Item2.TotalSeconds)));
var folders = new List<string>();
string folderResult = "";
foreach (var folder in ParallelMeasurements.Select(parallelMeasurement => parallelMeasurement.
Item1.Substring(0, parallelMeasurement.Item1.IndexOf("."))).
Where(folder => !folders.Contains(folder)))
{
folders.Add(folder);
folderResult += folder + ",";
}
folderResult = folderResult.TrimEnd(',');
string valueResult = folders.Select(folder => ParallelMeasurements.
Where(x => x.Item1.Substring(0, x.Item1.IndexOf(".")) ==
folder)).Select(views => views.Sum(x => x.Item2.TotalSeconds)).Aggregate("", (current, value) => current + (value + ","));
valueResult = valueResult.TrimEnd(',');
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.