思考 if-else 和三元运算符之间区别的简单方法:
- If-else 允许您决定将执行哪个代码块。
- 三元运算符可帮助您决定在单个语句中使用的两个对象或值(相同类型) 。
三元运算符出现编译器错误的原因是语言规则:三元运算符返回一个值。但是值在语句中使用;它们本身不是陈述。考虑:
int x = 1;
// Both these lines are invalid because a string literal is not a complete statement:
"x is an integer";
x < 0 ? "x is Negative" : "x is not Negative";
//Valid:
string intDescription = "x is an integer";
string describeNegative = x < 0 ? "x is Negative" : "x is not Negative";
// Invalid because the ternary operator chooses between values, and Console.WriteLine
// is void:
x < 0 ? Console.WriteLine("x is Negative") : Console.WriteLine("x is not Negative");
// Valid:
Console.WriteLine(x < 0 ? "x is Negative" : "x is not Negative");
// or:
string describeNegative = x < 0 ? "x is Negative" : "x is not Negative";
Console.WriteLine(describeNegative);
现在希望你能更好地理解三元运算符。不幸的是,您的代码还有另一个问题。即使这样编译,它实际上并没有做任何事情:
if (integerList.Direction == "ascending") {
integerList.Integers.OrderBy(i => i.IntegerValue);
} else{
integerList.Integers.OrderByDescending(i => i.IntegerValue);
}
OrderBy 创建了一个新对象,它IOrderedEnumerable<YourIntegerClass>
包含与所做的相同的内容Integers
,但已排序。OrderBy 返回这个新对象并保持原始容器不变。这是 Linq 扩展方法相对常见的模式,尽管大多数返回 IEnumerable 对象而不是 IOrderedEnumerable。
Integers
我猜你想对;的内容进行排序,而不是只制作一个你不做任何事情的副本。为此,您需要将 OrderBy 的结果分配回Integers
对象:
if (integerList.Direction == "ascending") {
//I'm guessing that Integers is a List, so I've added .ToList() as well here:
integerList.Integers = integerList.Integers.OrderBy(i => i.IntegerValue).ToList();
} else{
integerList.Integers = integerList.Integers.OrderByDescending(i => i.IntegerValue).ToList();
}
因为您在两个值之间进行选择(在这种情况下,分配给Integers
)您可以使用三元运算符:
integerList.Integers = integerList.Direction == "ascending"
? integerList.Integers.OrderBy(i => i.IntegerValue).ToList()
: integerList.Integers.OrderByDescending(i => i.IntegerValue).ToList();