简体   繁体   English

如何将这段代码重写为LINQ?

[英]How can I rewrite this code to LINQ?

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: 我有以下非常丑陋的代码,我想用一些不错的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 is List<Tuple<string, TimeSpan>> and the contents of the tuple.Item1 is for example: ParallelMeasurementsList<Tuple<string, TimeSpan>>并且tuple.Item1的内容例如:

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? LINQ可以吗? 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(',');

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM