static void Main(string[] args) { List <ImpactFile> HotFixImpactFiles = GetImpactFilesList(@"../../Data/Day0Day1.txt"); List <ImpactFile> RecentChangesImpactFiles = GetImpactFilesList(@"../../Data/After60ImpactFiles.txt"); GenericEqualityComparer <ImpactFileInfo, string> comparer = new GenericEqualityComparer <ImpactFileInfo, string>(x => x.FileName); var imapctFilesByIdHF = HotFixImpactFiles.GroupBy(f => f.TfsID).Select(g => new TfsItem { TfsID = g.Key, FilesInfo = g.Select(info => new ImpactFileInfo { FileName = info.FileName, CheckedInBy = info.CheckedInBy, CheckInDate = info.CheckInDate }).OrderByDescending(date => date.CheckInDate) .Distinct(comparer).ToList() }); var recentTFSItems = RecentChangesImpactFiles.GroupBy(f => f.TfsID).Select(g => new TfsItem { TfsID = g.Key, FilesInfo = g.Select(info => new ImpactFileInfo { FileName = info.FileName, CheckedInBy = info.CheckedInBy, CheckInDate = info.CheckInDate }).OrderByDescending(date => date.CheckInDate) .Distinct(comparer).ToList() }); DependencyList <TfsItem> dependencyList = new DependencyList <TfsItem>(); GetDeepDependency(imapctFilesByIdHF, recentTFSItems, dependencyList); DependencyList <TfsItem> sortedTfsList = Sort(dependencyList, x => x.DependentTfsList, (x) => { return(dependencyList.Where(y => y.TfsID == x.TfsID).FirstOrDefault()); }, x => x.TfsID); List <DependencyList <TfsItem> > groupDepList = Group(dependencyList, x => x.DependentTfsList, (x) => { return(dependencyList.Where(y => y.TfsID == x.TfsID).FirstOrDefault()); }, new GenericEqualityComparer <TfsItem, int>(x => x.TfsID)); string xml = GetXMLFromObject <DependencyList <TfsItem> >(dependencyList); Console.Read(); }
static void GetDeepDependency(IEnumerable <TfsItem> inputList, IEnumerable <TfsItem> compareList, DependencyList <TfsItem> dependencyList) { List <TfsItem> nextIterationInput = new List <TfsItem>(); foreach (var input in inputList) { foreach (var compare in compareList) { IEnumerable <ImpactFileInfo> intersectFiles = compare.FilesInfo.Intersect(input.FilesInfo, new GenericEqualityComparer <ImpactFileInfo, string>(x => x.FileName)); if (intersectFiles.Count() > 0) { input.DependentTfsList.Add(new DependentTfs() { TfsID = compare.TfsID, IntersectFiles = intersectFiles.ToList() }); nextIterationInput.Add(compare); } } dependencyList.Add(input); } if (nextIterationInput.Count > 0) { GenericEqualityComparer <TfsItem, int> genericComparer = new GenericEqualityComparer <TfsItem, int>(x => x.TfsID); nextIterationInput = nextIterationInput.Distinct(genericComparer).ToList(); GetDeepDependency(nextIterationInput, compareList.Except(nextIterationInput, genericComparer), dependencyList); } }
public static void Visit <T, D>(T item, Func <T, IEnumerable <D> > getDependencies, Func <D, T> getDependecyDetail, DependencyList <T> sorted, Dictionary <T, bool> visited) { bool inProcess; var alreadyVisited = visited.TryGetValue(item, out inProcess); if (alreadyVisited) { if (inProcess) { throw new ArgumentException("Cyclic dependency found."); } } else { visited[item] = true; var dependencies = getDependencies(item); if (dependencies != null) { foreach (var dependency in dependencies) { Visit(getDependecyDetail(dependency), getDependencies, getDependecyDetail, sorted, visited); } } visited[item] = false; sorted.Add(item); } }
public static DependencyList <T> Sort <T, D, TKey>(DependencyList <T> source, Func <T, IEnumerable <D> > getDependencies, Func <D, T> getDependecyDetail, Func <T, TKey> getKey) { return(Sort(source, getDependencies, getDependecyDetail, new GenericEqualityComparer <T, TKey>(getKey))); }