C#:return 语句末尾的生成器

C#: Generator at the end of a return statement

我有这个有效的 Python 代码,它反转输入和 returns 输出的所有字符的大小写:

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# 的新手,所以我可能遗漏了一些明显的东西,但我在网上找不到任何关于在这样的语句末尾使用生成器的参考资料。

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

C# 中最相似的语言结构是 LINQ 表达式,它与 目的 密切匹配,而后者通常落后于 Python 的理解。使用 LINQ 表达式,您可以从可枚举(.NET 的可迭代类型)开始,然后使用 WhereSelect LINQ 方法在其上应用过滤器或映射。

所以在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 method 将源中的每个字母映射到新值。