Home > OS >  GroupBy bool and Select values for new list
GroupBy bool and Select values for new list

Time:04-01

I am trying to get into more complex Linq queries and right away catch a point I am feeling stuck. I have a following list in DB:

ID            ELAPSED TIME           APPISRUNNING
1               12                        TRUE
2               54                        TRUE
3               32                        FALSE

Where ELAPSED TIME is TimeSpan and APPISRUNNING is a bool.

I would like to build a chart based on these values (https://github.com/beto-rodriguez/LiveCharts2). Chart build fine with this:

 Title = "Analytics";
  this.ActivityChartSeries = new ISeries[]
  {
    new PieSeries<double> { Values = new double[] { 2 }},
    new PieSeries<double> { Values = new double[] { 2 }},
    new PieSeries<double> { Values = new double[] { 2 }},
    new PieSeries<double> { Values = new double[] { 2 }},
    new PieSeries<double> { Values = new double[] { 2 }},
  };

Now I somehow need to first GroupBy bool and then select a new List? I have tried following:

  IEnumerable<DataRecord> dataRecords = await this.DataStore.GetItemsAsync();

  this.ActivityChartSeries = dataRecords
    .GroupBy(g => g.AppIsRunning)
    .Select(m => new
    { // BELOW IS TOTALLY UNCLEAR FOR ME
      Values = m.Select(r => r.EngineElapsed.Ticks),
      Name = m.Select(r => r.Name),
    })
    .Select(x =>
    new PieSeries<double>
    {
      Values = new List<double> { x.Values.FirstOrDefault() },
      Name = x.Name.FirstOrDefault(),
    });

Type of assigned variable:

public IEnumerable<ISeries> ActivityChartSeries

This part is totally unclear for me:

      Values = m.Select(r => r.EngineElapsed.Ticks),
      Name = m.Select(r => r.Name),

How after GroupBy I can create two types of data? Basically I need

  1. "Application Running" and "Values"
  2. "Application is not Running" and "Values"

EDIT:

Code provided by Somar Zein compiles fine:

var results = activityChartSeries
            .GroupBy(a=> a.AppIsRunning)
            .Select(item=> new PieSeries<double>{
                        Name = item.Key ? "Application is Running" : "Application is not Running",
                        Values = item.Select(x=> Convert.ToDouble(x.ElapsedTime.Ticks)).ToList()
        });

However as a result I am getting something like this, why it is reloading in a loop?

Here is result: enter image description here


EDIT2:

So I have created an example for testing purposes:

Class:

  public class DataModel
  {
    public int Id { get; set; }
    public TimeSpan ElapsedTime { get; set; }
    public bool AppIsRunning { get; set; }
  }

Code:

  List<DataModel> records = new List<DataModel>();

  records.Add(new DataModel { Id = 1, ElapsedTime = new TimeSpan(1, 20, 30), AppIsRunning = true });
  records.Add(new DataModel { Id = 2, ElapsedTime = new TimeSpan(1, 20, 30), AppIsRunning = true });
  records.Add(new DataModel { Id = 3, ElapsedTime = new TimeSpan(1, 20, 30), AppIsRunning = true });
  records.Add(new DataModel { Id = 4, ElapsedTime = new TimeSpan(1, 20, 30), AppIsRunning = true });
  records.Add(new DataModel { Id = 5, ElapsedTime = new TimeSpan(1, 20, 30), AppIsRunning = true });

  this.ActivityChartSeries = records
    .GroupBy(g => g.AppIsRunning)
    .Select(item => new PieSeries<double>
    {
      Name = item.Key ? "Running" : "Not Running",
      Values = new double[] { 2, 4 },
    });

I get the same reloading effect, even thou originally provided Example from LiveCharts work fine.

CodePudding user response:

you could try doing something like following:

var results = activityChartSeries
            .GroupBy(a=> a.AppIsRunning)
            .Select(item=> new PieSeries<double>{
                        Name = item.Key ? "Application is Running" : "Application is not Running",
                        Values = item.Select(x=> Convert.ToDouble(x.ElapsedTime.Ticks)).ToList()
        });

hope that could be helpful!

  • Related