使用 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 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 毫秒内结束。
有人可以发现此测量中是否存在问题吗?