有点螺母要裂。我有算法的强力实现,这并不是真的那么难,但是显然我想要更有效的方法。
问题如下:
假设您有n个数组,每个数组都填充了1到n之间的一些值。我需要确定是否可以从每个数组中选择一个元素,以便我一次从1到n中选择每个元素。一个小例子:假设n = 4,我们有这些n数组:
[1,2,3,4]
[1,3]
[2,4]
[3,4]
Run Code Online (Sandbox Code Playgroud)
数组的这种组合将通过算法,因为可以(例如)分别从每个数组中选择1、3、2、4。另一种可能性是2、1、4、3。一个反例是:
[1,2,3]
[3]
[3,4]
[3,4]
Run Code Online (Sandbox Code Playgroud)
在这里,您清楚地看到这些输入数组不会通过算法。不可能从每个数组中选择一个元素,而每个元素只能被选择一次。
就像我说的那样,蛮力方法并不那么复杂,但是我想要一种更高效的方法,而不经历所有可能的排列,直到找到通过标准的排列。
我正在尝试创建一个简单的报告工具,用户可以从一组KPI,图表,聚合函数和其他参数中进行选择,单击一个按钮,然后调用wcf服务,然后返回一个自定义模型数据.然后可以将其显示在MVC/WPF应用程序中(可以是两者).
由于用户可能来自多个国家/地区,因此我希望使用数据注释以适合当前用户习惯的语言和数字格式的方式绘制所有数字和标题.
加载数据和所有东西工作得很好,没有任何问题.此外,我使用数据注释,因此所有语言/文化特定的设置都得到了照顾.当我尝试将所有数据放入我想要显示给用户的模型时,问题就开始了.
我要做的是有一个Report类,它包含一组列.每列可以是int/double/...值的列表.现在,因为我正在处理WCF并且上面的解释暗示(据我所知)泛型的使用,我假设我可以使用[KnownType]或[ServiceKnownType]进行类/ wcf操作,而实际使用的是基类型或接口作为返回值.从来没有真正试过这个,但我发现了一些对我来说似乎很合理的好解释,所以我想我不会对这部分有任何重大问题(至少我希望不会).
现在,我的界面就是这样(简化为专注于我遇到的实际问题):
public interface IReport<T> where T: IConvertible { ICollection<IColumn<T>> Columns { get; set; } }
public interface IColumn<T> where T: IConvertible { ICollection<IValue<T>> Values { get; set; } }
public interface IValue<T> where T: IConvertible { T Value { get; set; } }
Run Code Online (Sandbox Code Playgroud)
由于每列中的值可能是int/double/...,我假设我必须只为该值设置一个实际的类(我不认为我可以在集合类型上使用数据注释属性),因此:
public class IntValue: IValue<int>
{
[DisplayFormat(DataFormatString = "{0:#,##0;-#,##0;'---'}", ApplyFormatInEditMode = true)]
public int Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
当然,这看起来很奇怪,因为你可以让它成为一个泛型类,它实现了IValue并完成了它,但如果我做了愚蠢的事情并为每个可能的类型创建一个类(现在我输入它,那个听起来真的很糟糕,我知道),我可以使用DisplayFormat属性而不必担心它会呈现给用户的方式,它总是合适的.
现在,对于实现IColumn和IReport的类,这很简单:
public class Report<T>: IReport<T> where T: IConvertible
{
public ICollection<IColumn<T>> …Run Code Online (Sandbox Code Playgroud)