Использование объединения нулей в выражении foreach - PullRequest
1 голос
/ 24 сентября 2010

Попытка выяснить, как заставить оператор нулевого слияния работать в цикле foreach.

Я проверяю, чем заканчивается строка и на основании этого направляет ее к определенному методу. В основном то, что я хочу сказать, это ....

foreach (String s in strList)
{
    if s.EndsWith("d") ?? Method1(s) ?? Method2(s) ?? "Unknown file type";
}

При попытке сделать это, конечно, вы получаете «Оператор ?? не может быть использован для типа bool и типа string». Я знаю, что есть другие способы сделать это, просто хочу посмотреть, как это можно сделать с объединением нулей.

Хороших выходных.

@ Ричард Эв: Да, конечно. Переключить, если еще и т. Д. Было просто любопытно, как это может быть обработано

@ Jon Skeet: Прочитав ваши комментарии, он ударил меня, это просто плохо! я заинтересованы в двух расширениях файлов в основном. Если файл заканчивается на «abc» для Например, отправьте в метод 1, если файл заканчивается на «xyz», отправьте в метод 2. Но Что, если файл заканчивается расширением "hij" ... boom, все готово.

Спасибо Брайану и GenericTypeTea за вдумчивый ввод

Я доволен, называя это закрытым.

Ответы [ 4 ]

8 голосов
/ 24 сентября 2010

Похоже, вы хотите использовать обычный троичный оператор, а не объединение нулей. Что-то вроде:

(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;
3 голосов
/ 24 сентября 2010

Я думаю, вам нужна комбинация условного (троичного) оператора и оператора объединения нулей:

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
1 голос
/ 24 сентября 2010

Я думаю, что компилятор дал вам соответствующий ответ, вы не можете.

Объединение нулей - это по существу утверждение if:

if(x == null)
  DoY();
else
  DoZ();

Логическое значение не может быть нулевым, поэтомуне может слиться так.Я не уверен, что возвращают другие ваши методы, но похоже, что вам нужен простой оператор ||.

0 голосов
/ 24 сентября 2010

Сначала необходимо использовать оператор объединения нулей ?? для защиты от нулевой ссылки s.Затем используйте троичный оператор ? для выбора между Method1 и Method2.Наконец, снова используйте оператор объединения нулей ??, чтобы задать значение по умолчанию.

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";
}
...