在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
的方式,并且Select
与from + let
不完全相同C0]?
在这里,您可以使用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);