在C#LINQ中是否有必要替代`let`关键字?

问题描述 投票:0回答:1

在C#LINQ中是否有必要替代let关键字?

例如在MSDN documentation中有声明性LINQ示例:

var earlyBirdQuery =
            from sentence in strings
            let words = sentence.Split(' ')
            from word in words
            let w = word.ToLower()
            where w[0] == 'a' || w[0] == 'e'
                || w[0] == 'i' || w[0] == 'o'
                || w[0] == 'u'
            select word;

而且我想以命令式的方式写它。有可能吗?

我知道我可以执行以下操作:

var earlyBirdQuery = sentence
.Select(s => s.Split(' '))
.Select(w => w.ToLower())
.Where(w => w[0] == 'a' || w[0] == 'e' || w[0] == 'i' || w[0] == 'o' || w[0] == 'u')
.Select(w => w);

[是否表示强制性地Select具有声明性方式的from + let效果,或者还有其他模仿let的方式,并且Selectfrom + let不完全相同C0]?

c# linq let
1个回答
1
投票

在这里,您可以使用SelectMany展平嵌套序列。

char[] vowels = new[] { 'a', 'e', 'i', 'o', 'u' };
var earlyBirdQuery = sentence
    .SelectMany(s => s.Split(' '))
    .Select(w => w.ToLower())
    .Where(w => vowels.Contains(w[0]));

在其他情况下,您可以通过创建匿名类型来存储中间结果。例如:

string[] list = new[] { "A", "B" };
var result = from x in list
                let y = x.ToLowerInvariant()
                where y == "a"
                select x + " " + y;

使用扩展方法语法:

string[] list = new[] { "A", "B" };
var result = list
    .Select(x => new { x, y = x.ToLowerInvariant() })
    .Where(a => a.y == "a")
    .Select(a => a.x + " " + a.y);
© www.soinside.com 2019 - 2024. All rights reserved.