【发布时间】:2018-04-10 16:50:47
【问题描述】:
我正在寻找 C# 中任意数量对象的笛卡尔积。我的情况有点不寻常——我的输入不是基本类型列表,而是具有基本类型列表属性的对象。
我的输入输出对象如下:
public class Input
{
public string Label;
public List<int> Ids;
}
public class Result
{
public string Label;
public int Id;
}
一些示例输入数据:
var inputs = new List<Input>
{
new Input { Label = "List1", Ids = new List<int>{ 1, 2 } },
new Input { Label = "List2", Ids = new List<int>{ 2, 3 } },
new Input { Label = "List3", Ids = new List<int>{ 4 } }
};
还有我预期的输出对象:
var expectedResult = new List<List<Result>>
{
new List<Result>
{
new Result{Label = "List1", Id = 1},
new Result{Label = "List2", Id = 2},
new Result{Label = "List3", Id = 4}
},
new List<Result>
{
new Result{Label = "List1", Id = 1},
new Result{Label = "List2", Id = 3},
new Result{Label = "List3", Id = 4}
},
new List<Result>
{
new Result{Label = "List1", Id = 2},
new Result{Label = "List2", Id = 2},
new Result{Label = "List3", Id = 4}
},
new List<Result>
{
new Result{Label = "List1", Id = 2},
new Result{Label = "List2", Id = 3},
new Result{Label = "List3", Id = 4}
}
};
如果我提前知道“输入”中的项目数,我可以这样做:
var knownInputResult =
from id1 in inputs[0].Ids
from id2 in inputs[1].Ids
from id3 in inputs[2].Ids
select
new List<Result>
{
new Result { Id = id1, Label = inputs[0].Label },
new Result { Id = id2, Label = inputs[1].Label },
new Result { Id = id3, Label = inputs[2].Label },
};
我正在努力使其适应任意数量的输入 - 有没有可能的方法来做到这一点?
【问题讨论】:
-
感谢您查看此 Erno。我已经查看了各种笛卡尔积答案——但是它们都处理基本类型的输入(例如,
List<int>)。我希望在我的输入列表中使用一个属性作为笛卡尔积的比较,这使它有点棘手。重复链接和评论中的链接都没有解决这部分问题,请问您可以重新打开吗?
标签: c#