首页 > 解决方案 > C#:返回语句末尾的生成器

问题描述

我有这个工作 Python 代码,它反转输入的所有字符的大小写并返回输出:

return ''.join(letter.upper() if letter.islower() else (letter.lower() if letter.isupper() else letter) for letter in input())

在这一行中,For 循环位于行的末尾而不是行的末尾,而不是它的前面或上面的行。

这在 C# 中可能吗?我有以下函数的工作版本,其中 text1 是输入,但我只能将其压缩为 3 行而不是 1 行:

string result = string.Empty;
foreach(char letter in text1) result += Char.IsLower(letter) ? letter.ToString().ToUpper() : (Char.IsUpper(letter) ? letter.ToString().ToLower() : letter.ToString());
return result;

我认为可以通过这样做来实现:

return String.Join('', Char.IsLower(letter) ? letter.ToString().ToUpper() : (Char.IsUpper(letter) ? letter.ToString().ToLower() : letter.ToString()) foreach(char letter in text1));

但是语法最后不允许使用 foreach 生成器。

我对 C# 还很陌生,所以我可能会遗漏一些明显的东西,但是我在网上找不到任何关于在这样的语句末尾使用生成器的参考。

标签: pythonc#python-3.xforeachgenerator

解决方案


(something for x in iterable)在 Python 中是一种特殊的理解语法,可用于基于现有的迭代创建列表或生成器。它是一种特殊语法,与普通循环共享关键字,for但与普通循环没有直接关系。语法是 Python 独有的,在 C# 中没有直接替代。

C# 中最接近的类似语言结构是 LINQ 表达式,它与Python 理解背后的目的非常匹配。Where使用 LINQ 表达式,您可以从可枚举(这是 .NET 的可迭代类型)开始,然后使用和SelectLINQ 方法在其之上应用过滤器或映射。

因此,在 Python 中以以下示例为例:

example = 'Foo Bar!'
result = ''.join(letter.upper() if letter.islower() else (letter.lower() if letter.isupper() else letter) for letter in example)
print(result) #fOO bAR!

在 C# 中使用 LINQ 的直接等效项如下所示:

var example = "Foo Bar!";
var result = string.Join("", example.Select(letter =>
    char.IsLower(letter) ? char.ToUpper(letter) :
    char.IsUpper(letter) ? char.ToLower(letter) : letter
));
Console.WriteLine(result); // fOO bAR!

这是有效的,因为字符串是可枚举的字符 ( IEnumerable<char>),因此您可以使用该Select方法将每个字母从源映射到新值。


推荐阅读