使用 String.Split() 方法或 C# 中的 Linq Lambda 表达式从给定字符串中查找拆分字符长度的最

本文关键字:查找 字符串 拆分 字符 表达式 Split String 方法 Lambda Linq 中的 | 更新日期: 2023-09-27 18:33:51

我有一个名为"RamaSubbaReddyabcdaacacakkkoooahgafffgahgghsa"的字符串。我想知道给定字符串中可用的"a"字符的数量。根据我的知识,我找到了两种方法来找到计数。它们是:1) 通过使用 String.Split() 2) Linq Lambda 表达式

我的观察:

1)如果我使用String.Split(),它会返回错误的结果2)如果我使用Linq Lambda表达式,它将返回正确的结果。

在这里,我的疑问是如何使用 String.Split() 从给定字符串中获取给定拆分字符的计数

还请告诉我,从给定字符串"String.Split()"或"Linq Lambda"表达式中获取给定拆分字符计数的最佳方法是什么?

请找到完整的示例:

                                                                                                                   using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace SplitData
{
    class Program
    {
        static void Main(string[] args)
        {
            SplitData("RamaSubbaReddyabcdaacacakkkoooahgafffgahgghsa", 'a');
            SplitData("RamaSubbaReddyabcdaacacakkkoooahgafffgahgghsa", 'r');
            SplitData("RamaSubbaReddyabcdaacacakkkoooahgafffgahgghsa", 'R');
            SplitData("RamaSubbaReddyabcdaacacakkkoooahgafffgahgghsa", 'm');
            SplitData("RamaSubbaReddyabcdaacacakkkoooahgafffgahgghsa", 'd');
            SplitData("RamaSubbaReddyabcdaacacakkkoooahgafffgahgghsa", 'g');
            SplitData("RamaSubbaReddyabcdaacacakkkoooahgafffgahgghsa", 's');
            SplitData("RamaSubbaReddyabcdaacacakkkoooahgafffgahgghsa", 'o');
            SplitData("RamaSubbaReddyabcdaacacakkkoooahgafffgahgghsa", 'c');
            SplitData("RamaSubbaReddyabcdaacacakkkoooahgafffgahgghsa", 'u');
            SplitData("RamaSubbaReddyabcdaacacakkkoooahgafffgahgghsa", 'f');

            Console.ReadKey();
        }
        private static void SplitData(string data,char split)
        {
            // using lambda expresion
            int len = data.AsEnumerable().Where(x => x.ToString().ToLower().Contains(split)).Count();  
            Console.WriteLine("Total '" + split + "' available are:{0} using lambda", len.ToString());
            //using normal split function
            len = data.Split(split).Length;
            Console.WriteLine("Total '" + split + "' available are:{0} using normal split", len.ToString());

        }
    }
}

使用 String.Split() 方法或 C# 中的 Linq Lambda 表达式从给定字符串中查找拆分字符长度的最

string str = "RamaSubbaReddyabcdaacacakkkoooahgafffgahgghsa";
int countA = str.Count(r => r == 'a');

如果要不区分大小写的计数,则:

string str = "RamaSubbaReddyabcdaacacakkkoooahgafffgahgghsa";
char searchChar = 'a';
int countA = str.Count(r => char.ToUpperInvariant(r) == char.ToUpperInvariant(searchChar));

如果你要求在string.Split和Linq Count之间选择最佳选项,那么IMO,LINQ更具可读性。我不确定性能,但我怀疑 LINQ 版本更快。


如果要使用 string.Split 并使其不区分大小写,请构造一个包含两个元素的字符数组(大写和小写),然后使用如下所示Split

string str = "RamaSubbaReddyabcdaacacakkkoooahgafffgahgghsa";
char searchChar = 'a';
char[] delimeters = new char[2];
delimeters[0] = char.ToLowerInvariant(searchChar);
delimeters[1] = char.ToUpperInvariant(searchChar);
var count = str.Split(delimeters).Length - 1;

你的意思是你想计算一封信的出现次数?喜欢这个?

String data = "RamaSubbaReddyabcdaacacakkkoooahgafffgahgghsa";
Char letter = 'a';
Int32 totalOccurances = data.Count(character => character == letter);

对于不区分大小写的比较,您可以使用StringComparer实例或等效的 StringComparison枚举。至于你想怎么写,选择你的毒药。=)

// caller specifies comparison type
int Count1(string str, char searchChar, StringComparison comparison = StringComparison.CurrentCultureIgnoreCase)
{
    string searchStr = searchChar.ToString();
    int count = 0;
    for (int i = 0; i < str.Length; i++)
        if (string.Equals(searchStr, str[i].ToString(), comparison))
            count++;
    return count;
}
// ordinal comparison
int Count2(string str, char searchChar)
{
    string searchStr = searchChar.ToString();
    int count = 0;
    for (int i = 0; i < str.Length; i++)
        if (searchChar == str[i])
            count++;
    return count;
}
// ordinal comparison
int Count3(string str, char searchChar)
{
    return str.Split(searchChar).Length - 1;
}
// ordinal comparison
int Count4(string str, char searchChar)
{
    return str.Count(c => c == searchChar);
}
// caller specifies comparison type
int Count5(string str, char searchChar, StringComparison comparison = StringComparison.CurrentCultureIgnoreCase)
{
    string searchStr = searchChar.ToString();
    return str.Count(c => string.Equals(c.ToString(), searchStr, comparison));
}

不是一个花哨的 LINQ 解决方案,但尽管如此

int count = CountChar("RamaSubbaReddyabcdaacacakkkoooahgafffgahgghsa", 'a');
.....
int CountChar(string input, char toFind)
{
    int count = 0;
    int pos = -1;
    while((pos = input.IndexOf(toFind, pos+1)) != -1)
        count++;
    return count;
}

String.IndexOf 从位置
开始还有不区分大小写的选项

编辑:好吧,现在我很好奇,并决定用这个和lambda解决方案来测量时间。
差异是显着的.....

void Main()
{
    string str = "RamaSubbaReddyabcdaacacakkkoooahgafffgahgghsa";
    Stopwatch sw = new Stopwatch();
    sw.Start();
    for(int i = 0; i < 10000000; i++)
    {
        int count = CountChar(str, 'a');
     }   
    sw.Stop();
    Console.WriteLine("Using IndexOf:" + sw.ElapsedMilliseconds.ToString());  
    sw.Reset();
    sw.Start();
    for(int i = 0; i < 10000000; i++)
    {
        int countA = str.Count(r => r == 'a');
    }
    sw.Stop();
    Console.WriteLine("Using Count:" + sw.ElapsedMilliseconds.ToString());
}

第一个循环在 1160 毫秒内结束,第二个循环在 6200 毫秒内结束。
有人可以发现此测量中是否存在问题吗?