C# 获得所有独特的变化

C# 获得所有独特的变化,c#,.net,linq,math,C#,.net,Linq,Math,这是我的班级: public class Schedule { public string mintime { get; set; } public string maxtime { get; set; } public string weekday { get; set; } } 我有一张这样的时间表,重复一周的时间,比如 List<Schedule> list = new List<Schedule> { new Schedule {

这是我的班级:

public class Schedule
{
    public string mintime { get; set; }
    public string maxtime { get; set; }
    public string weekday { get; set; }
}
我有一张这样的时间表,重复一周的时间,比如

List<Schedule> list = new List<Schedule> {
    new Schedule { mintime = "01.01.2012", maxtime = "05.01.2012", weekday = "1" },
    new Schedule { mintime = "05.01.2012", maxtime = "10.01.2012", weekday = "1" },
    new Schedule { mintime = "10.01.2012", maxtime = "20.01.2012", weekday = "2" },
    new Schedule { mintime = "01.02.2012", maxtime = "10.02.2012", weekday = "2" },
    new Schedule { mintime = "01.03.2012", maxtime = "10.03.2012", weekday = "3" },
    new Schedule { mintime = "01.04.2012", maxtime = "10.04.2012", weekday = "4" }
};
List List=新列表{
新时间表{mintime=“01.01.2012”,maxtime=“05.01.2012”,weekday=“1”},
新时间表{mintime=“05.01.2012”,maxtime=“10.01.2012”,weekday=“1”},
新时间表{mintime=“10.01.2012”,maxtime=“20.01.2012”,weekday=“2”},
新时间表{mintime=“01.02.2012”,maxtime=“10.02.2012”,weekday=“2”},
新时间表{mintime=“01.03.2012”,maxtime=“10.03.2012”,weekday=“3”},
新时间表{mintime=“01.04.2012”,maxtime=“10.04.2012”,weekday=“4”}
};
如何获得具有以下所有组合的列表>:

List<List<Schedule>> list = new List<List<Schedule>> {
    new List<Schedule> { 
        new Schedule { mintime = "01.01.2012", maxtime = "05.01.2012", weekday = "1" },
        new Schedule { mintime = "10.01.2012", maxtime = "20.01.2012", weekday = "2" }, 
        new Schedule { mintime = "01.03.2012", maxtime = "10.03.2012", weekday = "3" },
        new Schedule { mintime = "01.04.2012", maxtime = "10.04.2012", weekday = "4" }
    },
    new List<Schedule> { 
        new Schedule { mintime = "01.01.2012", maxtime = "05.01.2012", weekday = "1" },
        new Schedule { mintime = "01.02.2012", maxtime = "10.02.2012", weekday = "2" },
        new Schedule { mintime = "01.03.2012", maxtime = "10.03.2012", weekday = "3" },
        new Schedule { mintime = "01.04.2012", maxtime = "10.04.2012", weekday = "4" }
    },
    new List<Schedule> { 
        new Schedule { mintime = "05.01.2012", maxtime = "10.01.2012", weekday = "1" },
        new Schedule { mintime = "10.01.2012", maxtime = "20.01.2012", weekday = "2" },
        new Schedule { mintime = "01.03.2012", maxtime = "10.03.2012", weekday = "3" },
        new Schedule { mintime = "01.04.2012", maxtime = "10.04.2012", weekday = "4" }
    },
    new List<Schedule> { 
        new Schedule { mintime = "05.01.2012", maxtime = "10.01.2012", weekday = "1" },
        new Schedule { mintime = "01.02.2012", maxtime = "10.02.2012", weekday = "2" },
        new Schedule { mintime = "01.03.2012", maxtime = "10.03.2012", weekday = "3" },
        new Schedule { mintime = "01.04.2012", maxtime = "10.04.2012", weekday = "4" }
    },
};
List List=新列表{
新列表{
新时间表{mintime=“01.01.2012”,maxtime=“05.01.2012”,weekday=“1”},
新时间表{mintime=“10.01.2012”,maxtime=“20.01.2012”,weekday=“2”},
新时间表{mintime=“01.03.2012”,maxtime=“10.03.2012”,weekday=“3”},
新时间表{mintime=“01.04.2012”,maxtime=“10.04.2012”,weekday=“4”}
},
新列表{
新时间表{mintime=“01.01.2012”,maxtime=“05.01.2012”,weekday=“1”},
新时间表{mintime=“01.02.2012”,maxtime=“10.02.2012”,weekday=“2”},
新时间表{mintime=“01.03.2012”,maxtime=“10.03.2012”,weekday=“3”},
新时间表{mintime=“01.04.2012”,maxtime=“10.04.2012”,weekday=“4”}
},
新列表{
新时间表{mintime=“05.01.2012”,maxtime=“10.01.2012”,weekday=“1”},
新时间表{mintime=“10.01.2012”,maxtime=“20.01.2012”,weekday=“2”},
新时间表{mintime=“01.03.2012”,maxtime=“10.03.2012”,weekday=“3”},
新时间表{mintime=“01.04.2012”,maxtime=“10.04.2012”,weekday=“4”}
},
新列表{
新时间表{mintime=“05.01.2012”,maxtime=“10.01.2012”,weekday=“1”},
新时间表{mintime=“01.02.2012”,maxtime=“10.02.2012”,weekday=“2”},
新时间表{mintime=“01.03.2012”,maxtime=“10.03.2012”,weekday=“3”},
新时间表{mintime=“01.04.2012”,maxtime=“10.04.2012”,weekday=“4”}
},
};
?

是否可以使用LINQ获得它


我问题的主要主题是建立时间表列表。每个时间表应包括周一、周二、周三、周四、周五、周六和周日一次。
我需要使用一个更常见的列表来构建这样的列表,该列表包含许多周一、周三等的日程安排。

使用
Eric Lippert

List newList=CartesianProduct(List.GroupBy(l=>l.weekday))
.Select(x=>x.ToList())
.ToList();
--

公共静态IEnumerable CartesianProduct(IEnumerable序列)
{
IEnumerable emptyProduct=new[]{Enumerable.Empty()};
返回序列.聚合(
空产品,
(累加器,顺序)=>
来自蓄能器中的accseq
按顺序从项目开始
选择accseq.Concat(新[]{item}));
}

你能精确地回答你的问题吗?非常不清楚。为什么要使用字符串来表示日期?这将使帮助你变得更加困难。@Cybermaxs对不起我的英语。试图改进这个问题。请参阅问题更新。@JonSkeet为什么会变得更难?你能解释一下吗?@kseen:首先,它不是一种合适的数据类型。这显然是一个日期,而不是文本-那么你为什么要使用文本呢?此外,它使价值之间的比较比需要的更困难。我最初将您的问题解释为希望每个排列都使mintime早于maxtime,这需要进行比较。事实上,我仍然不知道你到底想要什么样的排列。很酷。顺便说一句,如果它是一个扩展方法,正确的顺序应该是:
list.GroupBy(l=>l.weekday).CartesianProduct().Select(x=>x.ToList()).ToList()另外,由于链接有时会坏掉,你能在这篇文章中包含该方法的代码吗?@BradRem我知道,但我没有将代码移动到静态类,而是简单地删除了
这个
,以便在我的环境中进行测试。
List<List<Schedule>> newList = CartesianProduct(list.GroupBy(l => l.weekday))
                               .Select(x => x.ToList())
                               .ToList();
public static IEnumerable<IEnumerable<T>> CartesianProduct<T>(IEnumerable<IEnumerable<T>> sequences)
{
    IEnumerable<IEnumerable<T>> emptyProduct = new[] { Enumerable.Empty<T>() };
    return sequences.Aggregate(
        emptyProduct,
        (accumulator, sequence) =>
        from accseq in accumulator
        from item in sequence
        select accseq.Concat(new[] { item }));
}