试图找出如何让null合并运算符在foreach循环中工作。
我正在检查字符串的结尾并基于此,将其路由到某个方法。基本上我想说的是....
foreach (String s in strList)
{
if s.EndsWith("d") ?? Method1(s) ?? Method2(s) ?? "Unknown file type";
}
在尝试这样做的时候,你当然得到“运算符??不能用于类型bool和类型字符串”。我知道还有其他方法可以做到这一点,只是想看看如何使用空合并来完成它。
祝周末愉快。
@Richard Ev:哦,当然是的。切换,如果其他,等等只是好奇它是怎么回事 可以处理 @Jon Skeet:看完你的评论后,它打了我,这真是太糟糕了!我是 基本上对两个文件扩展感兴趣。如果文件以“abc”结尾 例如,发送到方法1,如果文件以“xyz”结尾发送给方法2.但是 如果一个文件以“hij”的扩展名结束...繁荣,你就完成了。感谢Brian和GenericTypeTea以及感性输入
我满足于称它已关闭。
答案 0 :(得分:8)
看起来你想要使用普通的三元运算符,而不是空值合并。类似的东西:
(s.EndsWith("d") ? Method1(s) : Method2(s)) ?? "Unknown file type";
这相当于:
string result;
if (s.EndsWith("d"))
result = Method1(s);
else
result = Method2(s);
if (result == null)
result = "Unknown file type";
return result;
答案 1 :(得分:3)
我认为您需要条件(三元)运算符和空合并运算符的组合:
foreach (String s in strList)
{
string result = (s.EndsWith("d") ? Method1(s) : Method2(s))
?? "Unknown file type";
}
简单地说,这将做以下事情:
If s ends with d, then it will try Method1.
If s does not end with d then it will try Method2.
Then if the outcome is null, it will use "Unknown file type"
If the outcome is not null, it will use the result of either A or B
答案 2 :(得分:1)
我认为编译器给了你适当的答案,你不能。
Null合并本质上是if语句:
if(x == null)
DoY();
else
DoZ();
布尔值不能为空,因此您无法像这样合并它。我不确定你的其他方法会返回什么,但似乎你想要一个简单的||
运算符。
答案 3 :(得分:0)
您应首先使用??
null合并运算符来防止空s
引用。然后使用?
三元运算符在Method1
和Method2
之间进行选择。最后再次使用??
null合并运算符来提供默认值。
foreach (string s in strList)
{
string computed = s;
computed = computed ?? String.Empty;
computed = computed.EndsWith("d") ? Method1(s) : Method2(s);
computed = computed ?? "Unknown file type";
}