python - 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# 还很陌生,所以我可能会遗漏一些明显的东西,但是我在网上找不到任何关于在这样的语句末尾使用生成器的参考。
解决方案
(something for x in iterable)
在 Python 中是一种特殊的理解语法,可用于基于现有的迭代创建列表或生成器。它是一种特殊语法,与普通循环共享关键字,for
但与普通循环没有直接关系。语法是 Python 独有的,在 C# 中没有直接替代。
C# 中最接近的类似语言结构是 LINQ 表达式,它与Python 理解背后的目的非常匹配。Where
使用 LINQ 表达式,您可以从可枚举(这是 .NET 的可迭代类型)开始,然后使用和Select
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
方法将每个字母从源映射到新值。
推荐阅读
- git - 使用 Git 创建添加文件的存档
- regex - 有没有办法在 VS 代码中使用正则表达式用双引号将单词括起来并进行查找和替换?
- javascript - forEach 循环没有记录我想要的
- swift - 如何在 Swift 中使用左右箭头旋转 3d 对象?(场景套件)
- c# - 加入列表和单个字符串
- python - Pyopengl:如何在 glPushMatrix 和 glPopMatrix 中固定光线
- python-3.x - 在 Azure 应用服务上部署多容器应用
- excel - VBA 中的 SUMIFS 显示“无法获取 WorksheetFunction 类的 SumIfs 属性
- javascript - 当我从 MySQL 获取数据时,Ajax 不工作
- vb.net - 缺少 Visual Studio 函数