C#LINQ表达式问题
本文关键字:问题 表达式 C#LINQ | 更新日期: 2023-09-27 17:59:54
我有这个示例代码:
string[] digits = { "zero", "one", "two", "three",
"four", "five", "six", "seven", "eight", "nine" };
var shortDigits = digits.Where((digit, index) => digit.Length < index);
Console.WriteLine("Short digits:");
foreach (var d in shortDigits)
{
Console.WriteLine("The word {0} is shorter than its value.", d);
}
有没有一种方法可以通过使用LINQ表达式仅生成相同的输出?
我知道你指的只是var shortDigits = digits.Where((digit, index) => digit.Length < index);
,如果你指的是用LINQ
生成整个输出,我必须认真思考为什么要创建这样一个怪物
您可以执行以下操作以获得相同的输出:
int i = 0;
var shortDigits = from d in digits
where d.Length < i++
select d;
一个长的1行
Console.WriteLine(
string.Format("Short digits: 'r'n{0}",
string.Join(Environment.NewLine,
digits.Where((digit, index) => digit.Length < index)
.Select(digit =>
string.Format("The word {0} is shorter than its value.", digit))
.ToArray())));
使用一些自定义扩展方法可以简化代码。例如ToDelimeteredString()
你不能用LINQ做到这一点(好吧,如果你滥用它,你可以,但我们不想去那里),因为LINQ应该没有副作用,打印数字肯定是一个副作用(从某种意义上说,它不会影响数字本身)。
然而,使用List.ForEach
方法:可以足够接近
Console.WriteLine("Short digits:");
var shortDigits = digits.Where((digit, index) => digit.Length < index);
shortDigits.ToList().ForEach(d =>
Console.WriteLine("The word {0} is shorter than its value.", d));
实现一个像foreach循环一样工作的类似Linq的扩展方法是很简单的(例如,参见这个问题),但它被故意排除在Linq框架函数之外,因为它们被设计为没有副作用。因此,你目前的做法被认为是一种更好的做法。
您可以这样做:
var output = digits.Where(
(digit, index) => digit.Length < index).Select(d =>
string.Format("The word {0} is shorter than its value.", d));
但在某些情况下,您仍然需要一个循环来显示结果。。。