创建一个可以记住字符串的函数

时间:2017-09-04 06:19:59

标签: c#

基本上我想创建一个可以像这样使用的函数:

splitString("stringOfText");

这将返回一个字符。

首次运行该功能时,它将返回:s,第二次:t,依此类推。

它将从字符串中的第一个字符开始,并在下次运行该函数时返回下一个字符。然而。我希望能够用不同的字符串做到这一点,而不必担心完成第一个。这将被用作比较字符串与另一个字符串的一部分,但它主要是为了证明一点。这里的主要问题是我如何能够同时跟踪不同的字符串并且仍然具有可重用的代码。

6 个答案:

答案 0 :(得分:1)

最常见的方法是使用枚举器(让您的方法返回IEnumerable<char>)。但是你解决这个问题,我肯定会选择返回一个代表你可重复动作的对象,而不是多次用原始字符串调用相同的方法。

可以将状态存储在Dictionary<string, int>中,记住每个字符串的最后处理索引。但是,我看到的主要问题是当你比较两个碰巧相同的字符串时。

答案 1 :(得分:1)

写一个包装字符串的类?
我很抱歉,如果它没有编译它已经很长时间了,因为我写了C#

public class StringWrapper {
    private string decomposedString;
    private int index = 0;

    StringWrapper(string decomposeString) {
         decomposedString = decomposeString;
    }

    // Untested code but that's a rough idea, you'd have to test if it fits the length etc...
    public NextLetter() char => decomposedString.at(++index);

}

Michael Turczyn回答提供了更多信息。

编辑:

正如评论中提到的那样,这基本上是CharEnumerator,您可以通过致电String.GetEnumerator();来获取

答案 2 :(得分:1)

如果您只是想分别处理每个角色,请尝试以下方法:

string theString = "stringOfText";
foreach(char c in theString)
{
    Console.WriteLine(c); // or whatever you want to do with that char
}

String已经实现了IEnumerable<char>,这意味着你可以迭代这些字符。

请注意,这个(以及任何其他只能获得“chars”的实现)最适用于西方文本,在这些文本中,您不会因重音而疯狂。它将失败亚洲文本。原因是重音可能存储为单独的“字符”,亚洲字符可能需要两个字符。如果您想了解更多信息,请阅读this

答案 3 :(得分:0)

为此,您需要创建具有此类功能的类。由于有字段,类可以维护和记住它的状态,这就是你想要的。它将包含您想要使用的一个(或多个)方法,例如拆分一些字符串。

要拆分的字符串可以传入构造函数。

我会告诉你你使用的课程(或者可以创建自己的课程)。

答案 4 :(得分:0)

一个非常基本的版本可能是这样的:

private static readonly Dictionary<string, int> MyStrings = new Dictionary<string, int>();
public static char NextCharacter(string input)
{
    if (!MyStrings.ContainsKey(input)) MyStrings[input] = 0;
    return input[MyStrings[input]++];
}

但是,如果你的两个字符串实际上是相同的,这将不起作用。 此外,您应该添加一些逻辑来检查字符串长度,并在超出字符串长度时读取您想要做的事情。这个版本会抛出一个OutOfBounds Exception,根据你的意愿可能会很好。

如果您希望能够处理相等的字符串,则必须将索引传递给您的函数,指示您要处理的字符串:

private static readonly Dictionary<int, int> MyIndexes = new Dictionary<int, int>();
public static char NextCharacter(int index, string input)
{
    if (!MyIndexes.ContainsKey(index)) MyIndexes[index] = 0;
    return input[MyIndexes[index]++];
}

请注意,在最后一个版本中,没有检查你的字符串是否与你第​​一次传递的字符串相同,所以这会有效,但会产生意想不到的结果:

Console.WriteLine(NextCharacter(1, "ABCDEFG")); // 'A'
Console.WriteLine(NextCharacter(1, "ABCDEFG")); // 'B'
Console.WriteLine(NextCharacter(2, "ABCDEFG")); // 'A'
Console.WriteLine(NextCharacter(2, "ABCDEFG")); // 'B'
Console.WriteLine(NextCharacter(1, "TUVWXYZ")); // this will return 'V'

答案 5 :(得分:0)

使用c#

中的yield return语句解决了问题
IEnumerable<char> splitString(string str)
{
    var chars = str.GetEnumerator();
    while (chars.MoveNext())
        yield return chars.Current;
}

另见https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/yield