我一直在浏览 Linqpad 示例 linq 示例。在“Projecting - SelectMany”下,他们要求您尝试将以下 linq 语法翻译为 Fluent Syntax。这是那里的样本:
var fullNames = new[] { "Anne Williams", "John Fred Smith", "Sue Green" }
.AsQueryable();
IEnumerable<string> query =
from fullName in fullNames
from name in fullName.Split()
orderby fullName, name
select name + " came from " + fullName;
query.Dump();
我使用以下方法对其进行了转换:
var myQuery = fullNames
.SelectMany(
fullName => fullName.Split()
.OrderBy(fn => fullName)
.ThenBy(fn=> fn)
, (fullName, name) => ((name + " came from ") + fullName)
);
但是 linqpad 生成以下内容:
IEnumerable<string> query2 = fullNames
.SelectMany (fName => fName.Split().Select (name => new { name, fName } ))
.OrderBy (x => x.fName)
.ThenBy (x => x.name)
.Select (x => x.name + " came from " + x.fName);
两者都返回相同的结果。一个比另一个快吗?你觉得哪个更好看? 想法?
最佳答案
是,有一点不同。 您的查询返回不正确的结果。 检查以下输入数组的查询结果:
var fullNames = new[] { "Anne Williams", "Sue Green", "John Fred Smith" }
.AsQueryable();
示例查询结果:
Anne came from Anne Williams
Williams came from Anne Williams
Fred came from John Fred Smith
John came from John Fred Smith
Smith came from John Fred Smith
Green came from Sue Green
Sue came from Sue Green
您的查询结果:
Anne came from Anne Williams
Williams came from Anne Williams
Green came from Sue Green
Sue came from Sue Green
Fred came from John Fred Smith
John came from John Fred Smith
Smith came from John Fred Smith
问题是您分别为源数组中的每个项目排序,因此您的项目与输入数组中的顺序完全相同。示例查询在所有项目生成后对其进行排序。
您的查询按以下方式工作:
"Anne Williams"
。如果没有更多元素,则结束查询。 ["Anne", "Williams"]
。 "Anne Williams"
和分割部分 ["Anne", "Williams"]
。 "Anne came from Anne Williams"
和 "Williamscame from Anne Williams"
。 示例查询就是这样工作的:
"Anne Williams"
。如果没有更多的元素去 5. ["Anne", "Williams"]
。 "Anne came from Anne Williams"
和 "Williamscame from Anne Williams"
。 关于c# - LINQ - SelectMany OrderBy 外部值然后是内部值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15979308/