简体   繁体   English

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

[英]What is the best way to find length of split characters from the given string by using String.Split() Method or Linq Lambda Expression in C#

I have String called "RamaSubbaReddyabcdaacacakkkoooahgafffgahgghsa". 我有一个名为“ RamaSubbaReddyabcdaacacakkkoooahgafffgahgghsa”的字符串。 I want to know number of "a" characters available in the give String. 我想知道给定字符串中可用的“ a”字符数。 As per my knowledge I found two ways to find the count. 据我所知,我发现了两种找到计数的方法。 That are: 1) By using String.Split() 2) Linq Lambda Expression 那是:1)通过使用String.Split()2)Linq Lambda表达式

My Observations: 我的观察:

1) If i use String.Split() it is returning wrong result 2) If i use Linq Lambda Expression it is returning correct result. 1)如果我使用String.Split()返回错误的结果2)如果我使用Linq Lambda Expression返回正确的结果。

Here my doubt is how can i get the count of the given split character from the given string by using String.Split() 在这里我的疑问是如何通过使用String.Split()从给定的字符串中获取给定的拆分字符的计数

And also please suggest me which is the best way to get count of the given split character from the given string either "String.Split()" or "Linq Lambda" expression? 并且还请建议我哪种方法是从给定字符串“ String.Split()”或“ Linq Lambda”表达式中获取给定拆分字符的最佳方法?

Please find the complete example: 请找到完整的示例:

                                                                                                                   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');

If you want case insensitive count then: 如果要不区分大小写的计数,则:

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

If you ask for best option between string.Split and Linq Count , then IMO, LINQ is more readable. 如果您要在string.Split和Linq Count之间string.Split最佳选择,那么IMO和LINQ更具可读性。 I am not sure about the performance but I suspect LINQ version to be faster. 我不确定性能,但是我怀疑LINQ版本会更快。


If you want to use string.Split and make it case insensitive then construct a character array of two elements, (with upper case and lower case) and then use Split like: 如果要使用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;

You mean you want to count the occurances of a letter? 您的意思是您要计算字母的出现次数? Like this? 像这样?

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

For case-insensitive comparison, you can use a StringComparer instance or equivalent StringComparison enum.. As far as how you want to write it, pick your poison. 对于不区分大小写的比较,可以使用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));
}

Not a fancy LINQ solution but nevertheless 虽然不是花哨的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 starting from a position 从位置开始的String.IndexOf
and there is also the case insensitive option 还有不区分大小写的选项

EDIT: Well now I was curious and decided to measure the timing with this and the lambda solution. 编辑:好吧,现在我很好奇,并决定用这个和lambda解决方案来衡量时间。
The difference is remarkable..... 区别是明显的.....

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());
}

The first loop ends in 1160 milliseconds and the second one in 6200 milliseconds. 第一个循环以1160毫秒结束,第二个循环以6200毫秒结束。
Can someone spot if there are problems in this measurements? 有人可以发现这种测量是否有问题吗?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM