C# 快速修剪并创建有效的数据组合
我确实在努力解决一个问题,我需要将可用场景“删减”到用户定义为有效的场景。下面是我试图在.Net(C#)中解决的问题的一个小例子。考虑到下面显示的级别/值,用户可以选择只有几个有效的组合,但是如果您想象下面的级别是30-40个级别的数据,而不是我所显示的5个级别,您可以看到我的困境。我可能需要通过数百万到数十亿个无效的组合才能得到有效的组合。有些情况下,级别中的所有值都适用,有些情况下,只有用户指定的组合才适用 数据的当前级别/值: 用户表示有效的组合为:C# 快速修剪并创建有效的数据组合,c#,algorithm,C#,Algorithm,我确实在努力解决一个问题,我需要将可用场景“删减”到用户定义为有效的场景。下面是我试图在.Net(C#)中解决的问题的一个小例子。考虑到下面显示的级别/值,用户可以选择只有几个有效的组合,但是如果您想象下面的级别是30-40个级别的数据,而不是我所显示的5个级别,您可以看到我的困境。我可能需要通过数百万到数十亿个无效的组合才能得到有效的组合。有些情况下,级别中的所有值都适用,有些情况下,只有用户指定的组合才适用 数据的当前级别/值: 用户表示有效的组合为: *Notice all from l
*Notice all from level 4 are valid
Receiver -> Sony -> 500 -999 -> Retail
Receiver -> Sony -> 1000 - Up -> Retail
给定5个级别信息的预期结果:
Receiver -> Sony -> 500-999 -> Open -Box -> Retail
Receiver -> Sony -> 500-999 -> New -> Retail
Receiver -> Sony -> 1000-Up -> Open -Box -> Retail
Receiver -> Sony -> 1000-Up -> New -> Retail
我尝试过的东西都是在小集合中执行的,但是如果我在组合中有很多级别和很大的间隙,在深入到这些级别之前不允许我修剪有效的组合,那么我将遇到重大的性能问题。我显然没有错误地处理这个问题
如有任何其他关于解决该问题的意见或建议,将不胜感激 假设您能够将输入解析为N个不同的集合,每个集合都包含特定级别的有效值,那么问题只是找到这N个集合的笛卡尔积 Eric Lippert在其中介绍了如何创建一个解决方案,以获得编译时未知序列的笛卡尔乘积。代码取自该帖子末尾,代码为:
static IEnumerable<IEnumerable<T>> CartesianProduct<T>(this 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}));
}
提供以下输出:
Receiver Sony 500 -999 Open -Box Retail
Receiver Sony 500 -999 New Retail
Receiver Sony 1000 - Up Open -Box Retail
Receiver Sony 1000 - Up New Retail
接收器索尼500-999开箱零售
接收器索尼500-999新零售
接收器索尼1000开放式零售
接收器Sony 1000-Up New Retail收到很多负面消息…是否有其他堆栈论坛可以提交此消息?您可以添加到目前为止的代码吗?也许您可以公开您当前的解决方案,以便我们能够更深入地了解您的问题您看过DNS如何工作或数据库索引如何工作吗?我相信你的问题与此类似。如果我正确理解您的问题,当您的客户做出选择时,需要排除其他选择。请查看此答案。希望这有帮助:谢谢Servy,这是一个很好的开始……我将修改/开始它,并阅读Eric的博客posting@scarpacci好吧,除非你知道如何提供输入的细节,否则真的没有什么可以提供的了。我甚至不想考虑在分析或处理它的过程中需要做些什么,而不知道这是否是一个问题,或者它的具体细节。今天我会提供更多的细节,可以为你的问题提供一些启发。 Receiver Sony 500 -999 Open -Box Retail Receiver Sony 500 -999 New Retail Receiver Sony 1000 - Up Open -Box Retail Receiver Sony 1000 - Up New Retail