我有以下非常丑陋的代码,我想用一些不错的LINQ重写它,但我无法弄清楚:
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
是List<Tuple<string, TimeSpan>>
,元组的内容例如是:Actor.ActorUsers
Actor.ActorInformation
User.Edit
简而言之,我想基于字符串的第一部分,即句点之前的内容,汇总度量。
最佳答案
这应该怎么办?
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);
打印输出
Actor,User
350,150
关于c# - 如何将这段代码重写为LINQ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35888719/