public bool TryGetValue( AssemblyIdentity identity, out TValue value, Func <Version, Version, TValue, bool> comparer ) { OneOrMany <KeyValuePair <AssemblyIdentity, TValue> > sameName; if (_map.TryGetValue(identity.Name, out sameName)) { for (int i = 0; i < sameName.Count; i++) { AssemblyIdentity currentIdentity = sameName[i].Key; if ( comparer(identity.Version, currentIdentity.Version, sameName[i].Value) && AssemblyIdentity.EqualIgnoringNameAndVersion(currentIdentity, identity) ) { value = sameName[i].Value; return(true); } } } value = default(TValue); return(false); }
public bool TryGetValue( AssemblyIdentity identity, out TValue value, bool allowHigherVersion = true ) { OneOrMany <KeyValuePair <AssemblyIdentity, TValue> > sameName; if (_map.TryGetValue(identity.Name, out sameName)) { int minHigherVersionCandidate = -1; for (int i = 0; i < sameName.Count; i++) { AssemblyIdentity currentIdentity = sameName[i].Key; if (AssemblyIdentity.EqualIgnoringNameAndVersion(currentIdentity, identity)) { if (currentIdentity.Version == identity.Version) { value = sameName[i].Value; return(true); } // only higher version candidates are considered for match: if (!allowHigherVersion || currentIdentity.Version < identity.Version) { continue; } if ( minHigherVersionCandidate == -1 || currentIdentity.Version < sameName[minHigherVersionCandidate].Key.Version ) { minHigherVersionCandidate = i; } } } if (minHigherVersionCandidate >= 0) { value = sameName[minHigherVersionCandidate].Value; return(true); } } value = default(TValue); return(false); }