using System.Collections.Generic;
using System.Collections.Specialized;
using System.Text.RegularExpressions;
public static void Main()
var data = new TokenInfoData[]
new TokenInfoData(255901, "Grand Bend ISD", "edfi.LocalEducationAgency", "edfi.LocalEducationAgency", 255901),
new TokenInfoData(255901, "Grand Bend ISD", "edfi.LocalEducationAgency", "edfi.EducationServiceCenter", 255950),
new TokenInfoData(255901001, "Grand Bend High School", "edfi.School", "edfi.LocalEducationAgency", 255901),
new TokenInfoData(255901001, "Grand Bend High School", "edfi.School", "edfi.EducationServiceCenter", 255950),
new TokenInfoData(255901001, "Grand Bend High School", "edfi.School", "edfi.School", 255901001),
var dataGroupedByEdOrgId = data
.GroupBy(x => (x.ClaimEducationOrganizationId, x.ClaimNameOfInstitution, x.ClaimDiscriminator), x => x);
var tokenInfoEducationOrganizations = new List<OrderedDictionary>();
foreach (var grouping in dataGroupedByEdOrgId)
var entry = new OrderedDictionary();
var (educationOrganizationId, nameOfInstitution, discriminator) = grouping.Key;
entry["education_organization_id"] = educationOrganizationId;
entry["name_of_institution"] = nameOfInstitution;
entry["type"] = discriminator;
foreach (var alternateEducationOrganization in grouping)
string type = alternateEducationOrganization.Discriminator.Split('.')[1];
string idPropertyName = Inflector.AddUnderscores($"{type}Id");
entry[idPropertyName] = alternateEducationOrganization.EducationOrganizationId;
tokenInfoEducationOrganizations.Add(entry);
string json = JsonConvert.SerializeObject(tokenInfoEducationOrganizations, Newtonsoft.Json.Formatting.Indented);
public class TokenInfoData
public TokenInfoData(int claimEducationOrganizationId, string claimNameOfInstitution, string claimDiscriminator, string discriminator, int educationOrganizationId)
ClaimEducationOrganizationId = claimEducationOrganizationId;
ClaimNameOfInstitution = claimNameOfInstitution;
ClaimDiscriminator = claimDiscriminator;
Discriminator = discriminator;
EducationOrganizationId = educationOrganizationId;
public int ClaimEducationOrganizationId { get; set; }
public string ClaimNameOfInstitution { get; set; }
public string ClaimDiscriminator { get; set; }
public string Discriminator { get; set; }
public int EducationOrganizationId { get; set; }
public static class Inflector
public static string AddUnderscores(string pascalCasedWord) => Regex.Replace(Regex.Replace(Regex.Replace(pascalCasedWord, "([A-Z]+)([A-Z][a-z])", "$1_$2"), "([a-z\\d])([A-Z])", "$1_$2"), "[-\\s]", "_").ToLower();