/// <summary> /// Remove duplicates found in the equivalence mappings. /// </summary> public IEnumerable <NuGetFramework> Reduce(IEnumerable <NuGetFramework> frameworks) { // order first so we get consistent results for equivalent frameworks var input = frameworks.OrderBy(f => f.DotNetFrameworkName, StringComparer.OrdinalIgnoreCase).ToArray(); var comparer = new NuGetFrameworkFullComparer(); for (var i = 0; i < input.Length; i++) { var dupe = false; IEnumerable <NuGetFramework> eqFrameworks = null; if (!_mappings.TryGetEquivalentFrameworks(input[i], out eqFrameworks)) { eqFrameworks = new List <NuGetFramework>() { input[i] }; } for (var j = i + 1; !dupe && j < input.Length; j++) { dupe = eqFrameworks.Contains(input[j], comparer); } if (!dupe) { yield return(input[i]); } } yield break; }
/// <summary> /// Creates a FrameworkReducer using custom framework mappings. /// </summary> public FrameworkReducer(IFrameworkNameProvider mappings, IFrameworkCompatibilityProvider compat) { _mappings = mappings; _compat = compat; _fullComparer = new NuGetFrameworkFullComparer(); _fwNameComparer = new NuGetFrameworkNameComparer(); }
public static T GetNearest <T>(IEnumerable <T> items, NuGetFramework framework, Func <T, NuGetFramework> selector) where T : class { var reducer = new FrameworkReducer(); var comparer = new NuGetFrameworkFullComparer(); var frameworkLookup = items.ToDictionary(item => selector(item)); var nearest = reducer.GetNearest(framework, frameworkLookup.Keys) ?? frameworkLookup.Where(f => comparer.Equals(f.Key, NuGetFramework.AnyFramework)) .Select(f => f.Key) .FirstOrDefault(); if (nearest == null) { return(null); } return(frameworkLookup[nearest]); }