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表达式仅生成相同的输出?

C#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));

但在某些情况下,您仍然需要一个循环来显示结果。。。