C#LINQ表达式问题

时间:2011-06-21 10:26:43

标签: c# linq

我有这个示例代码:

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

5 个答案:

答案 0 :(得分:2)

一个长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()

答案 1 :(得分:2)

我知道你所指的只是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;

答案 2 :(得分:1)

你无法用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));

答案 3 :(得分:0)

你可以这样做:

var output = digits.Where(
    (digit, index) => digit.Length < index).Select(d => 
      string.Format("The word {0} is shorter than its value.", d));

但是在某些时候你仍然需要一个循环来显示结果......

答案 4 :(得分:0)

实现像foreach循环一样工作的Linq类扩展方法是微不足道的(参见例如this question),但它故意被排除在Linq框架函数之外,因为它们被设计为侧面 - 免费。因此,您目前的做法被认为是一种更好的做法。