private IEnumerable<string> GetSampleLines(Sample s, List<string> keyList) { var lines = new List<string>(); foreach (string runFolder in s.RunFolders) { List<string> indexPairs = s.GetIndexPairsForRunFolder(runFolder); foreach (string indexPair in indexPairs) { List<int> lanes = s.GetLanesForRunFolderAndIndex(runFolder, indexPair); lanes.Sort(); string lanesString = ""; HashSet<int> allLanes = new HashSet<int>(GetAllLanes()); if (!allLanes.SetEquals(lanes)) lanesString = string.Join("+", lanes); List<string> line = new List<string>(); foreach (string key in keyList) { switch (key.ToLowerInvariant()) { case "runfolder": line.Add(runFolder); break; case "sampleid": case "sample_id": line.Add(s.SampleID); break; case "index": string[] splat = indexPair.Split('|'); line.Add(splat[0]); break; case "index2": string[] splat2 = indexPair.Split('|'); line.Add(splat2[1]); break; case "genomefolder": case "genome": line.Add(s.GenomePath); break; case "samplename": case "sample_name": line.Add(s.Name); break; case "manifest": string manifestKey = ManifestLookup.FirstOrDefault(kvp => kvp.Value == s.ManifestFileName).Key; if (manifestKey == null && s.ManifestFileName.StartsWith(Sample.UnknownManifest)) manifestKey = s.ManifestFileName.Replace(Sample.UnknownManifest, ""); line.Add(manifestKey ?? string.Empty); break; case "lane": case "lanes": line.Add(lanesString); break; case "sample_project": case "sampleproject": case "project": line.Add(s.SampleProject); break; case "genesfolder": line.Add(s.GenesFolder); break; case "fastqfolder": line.Add(s.FastqFolder); break; default: line.Add(GetCustomDataColumn(key.ToLowerInvariant(), s)); break; } } lines.Add(CSVWriter.GetLine(line.ToArray())); } } return lines; }