【问题标题】:How do I output every other word in a string?如何输出字符串中的所有其他单词?
【发布时间】:2022-02-04 06:14:05
【问题描述】:

我是 C# 新手,只知道基础知识。我正在寻找一个关于如何从字符串变量中获取所有其他单词的代码示例。例如,如果变量是

String x = "Help me, coding is difficult"; 

我想返回单个字符串“帮助编码困难”。它需要是一个接受一个字符串并返回它的过滤版本的函数。

有人提出了我在研究期间大多已经看到的重复:

  • How to split text into words? 显示了非常复杂的逻辑,例如考虑到标点​​符号。我认为仅仅依靠空格就可以了,但是如果您有更好的建议和解释,那就太好了。
  • Select every second element from array using lambda - 看起来很有希望,但示例显示了如何使用整数数组。我有字符串(或者如果可以调整字符串拆分代码来提供字符串数组,也可以是字符串数组)。
  • C# Print list of string array 这听起来也很有希望,但它展示了如何打印结果,而不是如何将其作为函数的值返回。

【问题讨论】:

  • 如何定义单词之间的边界?如果me, 是第一个单词,您会包含还是排除逗号?
  • 如果我没记错的话,最好排除我认为可以使用 .split 完成的逗号?
  • 除非你能以某种已知的方式限制文本,或者对边缘案例周围的许多错误感到满意,否则你就站在了这部漫画的错误一边:xkcd.com/1425 和你在问什么for 相当于一个功能齐全的自然语言处理器。
  • 标点符号呢?还是撇号?还是连字符? "What counts as a Word?" 很难描述,除非你只是在做“一个空间是唯一重要的事情”。
  • 如果您只是想去掉标点符号,并在空格上分割,那么string.Split 是正确的方向,然后是for 循环。我们可以回答这些问题,但我认为你会更适合先学习一些教程,一旦你尝试实现,就在这里提问

标签: c# string


【解决方案1】:

您需要首先定义什么是单词分隔符,只是空格、逗号、句点或分号或其他什么?然后你可以使用String.Split

char[] wordDelimiter = new[] { ' ','\t', ',', '.', '!', '?', ';', ':', '/', '\\', '[', ']', '(', ')', '<', '>', '@', '"', '\'' };
String x = "Help me, coding is difficult"; 
string[] words = x.Split(wordDelimiter, StringSplitOptions.RemoveEmptyEntries);

现在你有了一个包含所有单词的数组。但是你想要其他的,你可以将它们填充到 List&lt;string&gt; 并使用 for-loop 跳过其他的:

var everyOtherWord = new List<string>();
for(int i = 0; i < words.Length; i += 2)
{
    everyOtherWord.Add(words[i]);
}

我想返回“帮助编码困难”

所以你真的想要一个string 作为结果,其中包含这些用空格分隔的单词吗?然后使用String.Join(不知何故String.Split对应方法):

string result = string.Join(" ", everyOtherWord);

【讨论】:

    【解决方案2】:

    假设您将一个单词视为“空格之间的每个字符,或字符串的开头/结尾”,并且您没有尝试删除任何字母。

    var input = "Help me, coding is difficult";
    var everyOther = input
        .Split(' ')
        .Where((x, i) => i % 2 == 0);
    Console.WriteLine(string.Join(" ", everyOther));
    

    Where 的代码取自 this post

    想法是使用Where 的重载,它为您提供索引值,并查看该索引值是否为偶数,如果是,则将其包含在结果中。

    【讨论】:

    • 作为我对 C# 和一般编码的新手...您是否能够分解“.Where((x, i) => i % 2 == 0);”所以我对它的工作原理和作用有了更好的了解?
    • 呃,好吧。这里有很多话题。林克。拉姆达斯。模数除法。这三个术语应该为您提供一个起点。
    • @SeanNormandale 该部分根据索引将过滤器应用于集合。它是bool IsOdd(item, index) { return index % 2 == 0; } 的语法糖,传递给Where 方法:.Where(IsOdd)
    【解决方案3】:
    string s = "You win some. You lose some.";
    
    string[] subs = s.Split(' ');
    
    for(int i=0 ; i < subs.length ; i+=2)
    {
        Console.WriteLine($"Substring: {sub[i]}");
    }
    

    【讨论】:

      猜你喜欢
      • 2018-07-26
      • 2014-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      相关资源
      最近更新 更多