Search code examples
c#linq

How to get list of items by common code in LINQ


I have the following class in C#:

class AnalyteUnits {
  public string Analyte;
  public string Units;
}

So the data comes back looking like:

Analyte = "Ce", Units ="kg"
Analyte = "Fe", Units ="%"
Analyte = "Fe", Units = "g" etc etc

What I need is to shuffle this to look like:

analyte = "Fe", units = {"%", "g"}

How can I achieve this with LINQ?


Solution

  • You can try to GroupBy Analyte, e.g. given

    AnalyteUnits[] data = new AnalyteUnits[] {
      new AnalyteUnits() { Analyte = "Ce", Units = "kg" },
      new AnalyteUnits() { Analyte = "Fe", Units = "%" },
      new AnalyteUnits() { Analyte = "Fe", Units = "g" },
    };
    

    You can put

    var result = data
      .GroupBy(item => item.Analyte, item => item.Units)
      .ToDictionary(group => group.Key, group => group.ToArray());
    
    // Let's have a look:
    var report = string.Join(Environment.NewLine, result
      .Select(pair => $"{pair.Key} : {string.Join(", ", pair.Value)}"));
    
    Console.Write(report);
    

    Another possibility is Lookup instead of dictionary:

    var lookup = data
      .GroupBy(item => item.Analyte, item => item.Units)
      .ToLookup(group => group.Key, group => group); 
    
    // Let's have a look:
    var report = string.Join(Environment.NewLine, lookup
      .Select(pair => $"{pair.Key} : {string.Join(", ", pair.Value)}"));
    
    Console.Write(report); 
    

    Fiddle