【问题标题】: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#在 C# 中使用 String.Split() 方法或 Linq Lambda 表达式从给定字符串中查找拆分字符长度的最佳方法是什么
【发布时间】:2013-10-04 15:22:07
【问题描述】:

我有一个名为“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.ToLower() 在第二个中您采用“原样”的字符串。
  • 嗨乔恩。这不是stackoverflow.com/questions/541954/… 的重复问题。请在将问题作为重复问题之前仔细阅读问题..因为我要问的是:>>>>>>在上面的问题中引用它这里我的疑问是如何通过使用从给定字符串中获取给定拆分字符的计数String.Split() 还请建议我从给定字符串“String.Split()”或“Linq Lambda”表达式中获取给定拆分字符计数的最佳方法是什么?
  • @RamaSubbaReddyM:链接的问题地址显示了如何使用 String.Split() 执行此操作,并讨论了哪个选项是“最佳”。这是重复的。

标签: c# string linq lambda split


【解决方案1】:
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;

【讨论】:

  • 嗨 Habib,我如何使用 String.Split() 从给定字符串中获取给定拆分字符的计数?通过使用 linq 概念,我已经得到了正确的计数。
  • @RamaSubbaReddyM data.Split(split).Length - 1(注意区分大小写)
  • @RamaSubbaReddyM,您可以使用var count = str.Split(new[] { 'a', 'A' }).Length - 1;,但您必须构造一个大小写字符数组以使其不区分大小写。
  • 我很难理解使用 Count 和使用 Split 之间的区别(至少在结果上),然后计算拆分集的大小。这不会返回完全相同的计数吗?
  • @RamaSubbaReddyM,我刚刚更新了我的答案,即使用string.Split 来计算字符的出现(不区分大小写)
【解决方案2】:

你的意思是你想计算一个字母的出现次数?像这样?

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

【讨论】:

  • 嗨 Sircidesakit,我如何使用 String.Split() 从给定字符串中获取给定拆分字符的计数?通过使用 linq 概念,我已经得到了正确的计数。
  • The count of the given split character?例子?
  • 是的,我想要一个示例,如何使用 String.Split('a') 获取给定字符串中可用的拆分字符数('a' count)
【解决方案3】:

对于不区分大小写的比较,您可以使用 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));
}

【讨论】:

  • 天哪,这太彻底了!
【解决方案4】:

不是一个花哨的 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从一个位置开始
还有case insensitive option

编辑:现在我很好奇,决定用这个和 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 毫秒后结束。
有人能发现这个测量是否有问题吗?

【讨论】:

  • 嗯,这比在 char 处拆分字符串并构建字符串数组要好得多。不确定它是否比建议的 LINQ 解决方案性能更高,但对于这些字符串,这是一个真正的微小差异
  • 这实际上可能更快,因为每次迭代都没有 lambda 回调。因此,这将为您节省至少十亿分之一秒。甚至可能有两个!
  • (关于您的编辑)是的,这就是我所期望的。 Recusion/Lambdas 很有用,因为它们在概念上简化了程序,但它们当然不会给你带来任何性能上的好处。不过,它们确实为并行解决方案开辟了道路......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-27
  • 2015-07-02
  • 1970-01-01
  • 2010-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多