using System.Collections.Generic;
namespace GoogleUnitsConversion
static (string source, string destination, double coef)[] coeffs = {
("light year", "km", 9.461e+12),
static void Main(string[] args)
var allCoeffs = Queryable.Union<(string source, string destination, double coef)>(coeffs.AsQueryable(), coeffs.Select(s => (s.destination, s.source, 1 / s.coef))).ToArray();
var unit2 = "light year";
var result = SearchConversion(allCoeffs, unit1, unit2);
Console.WriteLine(result);
private static double SearchConversion((string source, string destination, double coef)[] allCoeffs, string unit1, string unit2)
var conversionAdded = allCoeffs.Where(w => w.source == unit1).Select(s => (destination:s.destination, coef:s.coef)).ToDictionary(k => k.destination, e => e.coef);
bool somethingChanged = true;
somethingChanged = false;
foreach (var existingConversion in conversionAdded.Keys.ToArray())
var nextStep = allCoeffs.Where(w => w.source == existingConversion && !conversionAdded.ContainsKey(w.destination));
foreach (var newConversion in nextStep)
if (existingConversion == unit1) continue;
var newCoeff = conversionAdded[existingConversion] * newConversion.coef;
conversionAdded.Add(newConversion.destination, newCoeff);
if (newConversion.destination == unit2)