【问题标题】:C#: Generator at the end of a return statementC#:返回语句末尾的生成器
【发布时间】:2021-12-14 15:48:36
【问题描述】:

我有这个工作 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# 还很陌生,所以我可能会遗漏一些明显的东西,但我在网上找不到任何关于在这样的语句末尾使用生成器的参考。

【问题讨论】:

    标签: python c# python-3.x foreach generator


    【解决方案1】:

    (something for x in iterable) 在 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 将每个字母从源映射到一个新值。

    【讨论】:

    • 当分隔符为空字符串时,为什么string.Joinstring.Concat 可以在这里工作吗?很好的解释和答案。
    • new string(query.ToArray())
    • @OlivierJacot-Descombes 是的,很多口味 :)
    • @zaggler 哦,是的,string.Concat 应该也能正常工作。我通常出于习惯使用string.Join,而没有真正考虑太多。但是,是的,在这里可以正常工作。
    • @poke 感谢您的反馈。
    猜你喜欢
    • 2016-10-06
    • 1970-01-01
    • 2019-08-18
    • 2012-12-16
    • 1970-01-01
    • 2019-04-18
    • 1970-01-01
    • 2017-09-10
    相关资源
    最近更新 更多