在foreach语句中使用null合并

时间:2010-09-24 15:02:36

标签: c# null foreach null-coalescing-operator

试图找出如何让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以及感性输入

我满足于称它已关闭。

4 个答案:

答案 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引用。然后使用?三元运算符在Method1Method2之间进行选择。最后再次使用?? 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";
}