我一直在浏览 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"
  • 返回第 1 点。

  • 示例查询就是这样工作的:
  • 从输入数组中获取元素。第一个是 "Anne Williams" 。如果没有更多的元素去 5.
  • 它被分成几部分,所以我们得到: ["Anne", "Williams"]
  • 元素一个接一个返回: "Anne came from Anne Williams""Williamscame from Anne Williams"
  • 返回第 1 点。
  • 排序应用于所有选定元素。
  • 关于c# - LINQ - SelectMany OrderBy 外部值然后是内部值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15979308/

    10-10 23:20