我正在玩C#3.0的新东西,我有这个代码(大部分来自MSDN),但我只能得到真,假,真......而不是真正的价值:
int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }; var oddNumbers = numbers.Select(n => n % 2 == 1); Console.WriteLine("Numbers < 5:"); foreach (var x in oddNumbers) { Console.WriteLine(x); }
如何修复它以显示整数列表?
将"选择"更改为"位置"
int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }; var oddNumbers = numbers.Where(n => n % 2 == 1); Console.WriteLine("Odd Number:"); foreach (var x in oddNumbers) { Console.WriteLine(x); }
"Select"方法为每个元素创建一个新的lambda结果列表(true/false)."Where"方法基于lambda进行过滤.
在C#中,您也可以使用此语法,您可能会发现它更清晰:
var oddNumbers = from n in numbers where n % 2 == 1 select n;
编译器转换为:
var oddNumbers = numbers.Where(n => n % 2 == 1).Select(n => n);
numbers.Select(n => n % 2 == 1);
将此更改为
numbers.Where(n => n % 2 == 1);
什么选择是"转换"一件事到另一件事.所以在这种情况下,它是"转换"n到"n%2 == 1"(这是一个布尔值) - 因此你得到所有的真实和谬误.
它通常用于获取物品的属性.例如,如果你有一个Person
对象列表,并且想要得到它们的名字,你就可以了
var listOfNames = listOfPeople.Select( p => p.Name );
你可以这样想:
使用以下方法将人员列表转换为字符串列表:(p => p.Name)
要"选择"(在单词的"过滤"意义上)集合的子集,您需要使用Where.
感谢微软的糟糕命名