我有这个示例代码:
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表达式生成相同的输出 ?
答案 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框架函数之外,因为它们被设计为侧面 - 免费。因此,您目前的做法被认为是一种更好的做法。