答案改编自列表的有序排列 https://stackoverflow.com/questions/42840771/ordered-permutation-of-listint:
public static class CourseExtensions
{
public static IEnumerable<IEnumerable<Course>> GetPermutations(this IEnumerable<Course> courses)
{
return GetCoursesHelper(courses, TimeSpan.Zero);
}
private static IEnumerable<IEnumerable<Course>> GetCoursesHelper(IEnumerable<Course> courses, TimeSpan from)
{
foreach (var course in courses)
{
if (course.Start < from) continue;
yield return new[] { course };
var permutations = GetCoursesHelper(courses, course.End);
foreach (var subPermutation in permutations)
{
yield return new[]{ course }.Concat(subPermutation);
}
}
}
}
完整代码:
void Main()
{
foreach (var courses in GetCourses().GetPermutations())
{
Console.WriteLine(string.Join(" -> ", courses
.Select(x => x.ToString())
.Concat(new [] { "DONE" })));
}
}
// Define other methods and classes here
public class Course
{
public string Name { get; set; }
public TimeSpan Start { get; set; }
public TimeSpan End { get; set; }
public override string ToString()
{
return string.Format("{0} ({1:hhmm}-{2:hhmm})",
Name, Start, End);
}
}
IEnumerable<Course> GetCourses()
{
var data = @"
| FINANCE 101 | 9:00 AM | 10:00 AM |
| FINANCE 102 | 10:00 AM | 11:00 AM |
| PYTHON 300 | 10:00 AM | 11:00 AM |
| SECURITY 101 | 11:00 AM | 12:00 PM |
| ECONOMICS 101 | 9:00 AM | 12:00 PM |
| DATABASE 200 | 11:00 AM | 1:00 PM |
".Trim();
return data.Split('\n')
.Select(r => r.Split('|').Select(c => c.Trim()).ToArray())
.Select(x => new Course
{
Name = x[1],
Start = DateTime.ParseExact(x[2], "h:mm tt", CultureInfo.InvariantCulture).TimeOfDay,
End = DateTime.ParseExact(x[3], "h:mm tt", CultureInfo.InvariantCulture).TimeOfDay
});
}
public static class CourseExtensions
{
public static IEnumerable<IEnumerable<Course>> GetPermutations(this IEnumerable<Course> courses)
{
return GetCoursesHelper(courses, TimeSpan.Zero);
}
private static IEnumerable<IEnumerable<Course>> GetCoursesHelper(IEnumerable<Course> courses, TimeSpan from)
{
foreach (var course in courses)
{
if (course.Start < from) continue;
yield return new[] { course };
var permutations = GetCoursesHelper(courses, course.End);
foreach (var subPermutation in permutations)
{
yield return new[]{ course }.Concat(subPermutation);
}
}
}
}
Output:
FINANCE 101 (0900-1000) -> DONE
FINANCE 101 (0900-1000) -> FINANCE 102 (1000-1100) -> DONE
FINANCE 101 (0900-1000) -> FINANCE 102 (1000-1100) -> SECURITY 101 (1100-1200) -> DONE
FINANCE 101 (0900-1000) -> FINANCE 102 (1000-1100) -> DATABASE 200 (1100-1300) -> DONE
FINANCE 101 (0900-1000) -> PYTHON 300 (1000-1100) -> DONE
FINANCE 101 (0900-1000) -> PYTHON 300 (1000-1100) -> SECURITY 101 (1100-1200) -> DONE
FINANCE 101 (0900-1000) -> PYTHON 300 (1000-1100) -> DATABASE 200 (1100-1300) -> DONE
FINANCE 101 (0900-1000) -> SECURITY 101 (1100-1200) -> DONE
FINANCE 101 (0900-1000) -> DATABASE 200 (1100-1300) -> DONE
FINANCE 102 (1000-1100) -> DONE
FINANCE 102 (1000-1100) -> SECURITY 101 (1100-1200) -> DONE
FINANCE 102 (1000-1100) -> DATABASE 200 (1100-1300) -> DONE
PYTHON 300 (1000-1100) -> DONE
PYTHON 300 (1000-1100) -> SECURITY 101 (1100-1200) -> DONE
PYTHON 300 (1000-1100) -> DATABASE 200 (1100-1300) -> DONE
SECURITY 101 (1100-1200) -> DONE
ECONOMICS 101 (0900-1200) -> DONE
DATABASE 200 (1100-1300) -> DONE