c#字符串索引的类型

本文关键字:类型 索引 字符串 | 更新日期: 2023-09-27 18:17:33

我需要访问intlong无法处理的字符串索引中的一个非常大的数字。我不得不使用ulong,但问题是,索引器只能处理类型int

这是我的代码,我已经标记了错误所在的行。有办法解决这个问题吗?

       string s = Console.ReadLine();
        long n = Convert.ToInt64(Console.ReadLine());               
        var cont = s.Count(x => x == 'a');
        Console.WriteLine(cont);
        Console.ReadKey();

代码的主要思想是识别字符串中有多少个'a'。还有其他的方法吗?

编辑:

我不知道是字符串索引容量不能超过int类型。我将for循环替换为linq line

var cont = s.Count(x => x == 'a');

现在,因为我的字符串不能超过一定数量。那么我如何重复我的字符串来附加它的字符1,000,000,000,000次而不是使用这个代码

for (int i = 0; i < 20; i++)
{
    s += s;
}

因为这段代码在字符串中生成随机字符数,如果我提高了20可能会导致溢出,所以我需要调整它以重复它自己,使字符串[index] = n//我上面声明的长。例如,如果我的字符串输入是"aba" n是10那么字符串将是"abaabaabaa"//总字符数为10

PS:我编辑了原始代码

c#字符串索引的类型

我假设你有一个编程任务或在线编码挑战,其中要求是"计算这个> 2 GB文件中字母'a'的所有实例"。您的解决方案是立即读取内存中的文件,并使用允许超过2GB的值的变量类型对其进行循环。

这会导致XY问题。首先,你不能在内存中拥有这么大的数组,所以你不会达到需要uint, longulong来索引它的地步。

相反,使用StreamReader以块方式读取文件,例如在c#中以块方式读取大文件。

可以使用无限序列重复字符串。我还没有添加任何检查有效参数等

static void Main(string[] args)
{
    long count = countCharacters("aba", 'a', 10);
    Console.WriteLine("Count is {0}", count);
    Console.WriteLine("Press ENTER to exit...");
    Console.ReadLine();
}
private static long countCharacters(string baseString, char c, long limit)
{
    long result = 0;
    if (baseString.Length == 1)
    {
        result = baseString[0] == c ? limit : 0;
    }
    else
    {
        long n = 0;
        foreach (var ch in getInfiniteSequence(baseString))
        {
            if (n >= limit)
                break;
            if (ch == c)
            {
                result++;
            }
            n++;
        }
    }
    return result;
}
//This method iterates through a base string infinitely
private static IEnumerable<char> getInfiniteSequence(string baseString)
{
    int stringIndex = 0;
    while (true)
    {
        yield return baseString[stringIndex++ % baseString.Length];
    }
}

对于给定输入,结果是7

我强烈建议您重新考虑您这样做的方式,但快速修复将使用foreach循环代替:

foreach(char c in s)
{
    if (c == 'a')
        cont++;         
}

使用Linq:

cont = s.Count(c => c == 'a');

我不确定n应该做什么。根据你的代码,它限制了字符串长度,但你的问题从来没有提到为什么或什么结束。

我需要访问字符串索引中的一个非常大的数字Int, long不能处理

this statement is not true

c# string的最大长度是int.Max,因为string.Length是一个整数,并且受此限制。你应该能够做

for (int i = 0; i <= n; i++)

字符串的最大长度不能超过int的大小,所以使用ulonglong来索引字符串是没有意义的。

简单地说,你试图解决错误的问题。

如果我们忽略程序在构建如此长的字符串时可能导致内存不足异常的事实,您可以简单地通过切换到int而不是ulong来修复代码:

for (int i = 0; i <= n; i++)

你也可以使用LINQ来做这些:

int cont = s.Take(n + 1).Count(c => c == 'a');

现在,在你的问题的第一句话你这样说:

我需要访问字符串索引中的一个非常大的数字,int和long无法处理。

这是完全不必要的,因为字符串的任何合法的索引都可以放在int中。

如果你需要在一些比。net中字符串的最大长度更长的输入上这样做,你需要改变你的方法;请使用Stream,而不是尝试将所有输入读入string

char seeking = 'a';
ulong count = 0;
char[] buffer = new char[4096];
using (var reader = new StreamReader(inStream))
{
    int length;
    while ((length = reader.Read(buffer, 0, buffer.Length)) > 0)
    {
        count += (ulong)buffer.Count(c => c == seeking);
    }
}