【发布时间】:2016-10-03 19:38:45
【问题描述】:
我希望这不是重复的,但我无法找到答案。 这似乎是我不希望的行为或缺少知识。
我有一个平台和配置对象列表。两者都包含一个成员字符串 CodeName。 CodeNames 列表如下所示:
dbContext.Platforms.Select(x => x.CodeName) => {"test", "PC", "Nintendo"}
dbContext.Configurations.Select(x => x.CodeName) => {"debug", "release"}
它们是从 MySQL 数据库中获得的,因此是 dbContext 对象。
这是我要在 LINQ 中翻译的简单代码,因为 2 foreach 已成为过去:
var choiceList = new List<List<string>>();
foreach (Platform platform in dbContext.Platforms.ToList())
{
foreach (Configuration configuration in dbContext.Configurations.ToList())
{
choiceList.Add(new List<string>() { platform.CodeName, configuration.CodeName });
}
}
这段代码给出了我想要的,首先保留平台名称,如下所示:
var results = new List<List<string>>() {
{"test", "debug"},
{"test", "release"},
{"PC", "debug"}
{"PC", "release"}
{"Nintendo", "debug"}
{"Nintendo", "release"}};
但如果我把它翻译成这个,我的列表会以不同的顺序包含项目:
var choiceList = dbContext.Platforms.SelectMany(p => dbContext.Configurations.Select(t => new List<string>() { p.CodeName, t.CodeName })).ToList();
我会这样结束,平台名称并不总是第一个,这不是我们想要的:
var results = new List<List<string>>() {
{"debug", "test"},
{"release", "test"},
{"debug", "PC"}
{"PC", "release"}
{"debug", "Nintendo"}
{"Nintendo", "release"}};
我的问题是,是否有可能使用 LINQ 获得所需的结果?
如果我不清楚或我的问题缺少某些细节,请告诉我。 谢谢
编辑:所以 Ivan 找到了解释,因此我修改了我的代码。 实际上,只有 SelectMany 前面的 Enumerable 需要 .ToList()。 我还应该提到我一直需要一个列表>。
感谢大家的快速输入,非常感谢。
【问题讨论】:
-
-
@DStanley 您希望在 SQL 中生成代码的有序结构是什么?我希望它会用这两个元素创建一个新包,因为这几乎是 SQL 真正使用的唯一集合,除非明确排序,否则它本质上是无序的。
-
在没有 ToList 的情况下尝试 2 个 foreach 循环,您将看到相同的行为。