字符在字符串数组中出现的最大次数

2023-12-02

在 C# 中,给定数组:

string[] myStrings = new string[] {
  "test#test",
  "##test",
  "######", // Winner (outputs 6)
};

如何找到该字符出现的最大次数#出现在单个字符串中?

我当前的解决方案是:

int maxOccurrences = 0;
foreach (var myString in myStrings)
{
    var occurrences = myString.Count(x => x == '#');
    if (occurrences > maxOccurrences)
    {
        maxOccurrences = occurrences;
    }
}

return maxOccurrences;

有没有更简单的方法使用 linq 可以直接作用于myStrings[] array ?

是否可以将其制作成可以在任何情况下工作的扩展方法IEnumerable<string> ?


首先,让我们将字符串投影到具有匹配数的序列中:

myStrings.Select(x => x.Count(x => x == '#')) // {1, 2, 6} in your example

然后选择最大值:

int maximum = myStrings
    .Select(s => s.Count(x => x == '#'))
    .Max(); // 6 in your example

让我们创建一个扩展方法:

public static int CountMaximumOccurrencesOf(this IEnumerable<string> strings, char ch)
{
    return strings
        .Select(s => s.Count(c => c == ch))
        .Max();
}

然而有一个很大的HOWEVER。在 C# 中你调用什么char不是你们用你们的语言所说的性格。这在其他帖子中已被广泛讨论,例如:将大文本分割成小块的最快方法 and 如何执行 Unicode 感知的逐个字符比较?那我就不在这里重复一切了。要“意识到 Unicode”,您需要使代码更加复杂(请注意代码是在此处编写的,然后未经测试):

private static IEnumerable<string> EnumerateCharacters(string s)
{
    var enumerator = StringInfo.GetTextElementEnumerator(s.Normalize());
    while (enumerator.MoveNext())
        yield return (string)enumerator.Value;
}

然后将我们原来的代码修改为:

public static int CountMaximumOccurrencesOf(this IEnumerable<string> strings, string character)
{
    return strings
        .Select(s => s.EnumerateCharacters().Count(c => String.Equals(c, character, StringComparison.CurrentCulture))
        .Max();
}

注意Max()单独要求集合不为空(使用DefaultIfEmpty()如果集合可能为空并且这不是错误)。为了不随意决定在这种情况下做什么(如果发生则抛出异常或仅返回 0),您可以降低此方法的专门性,并将此责任留给调用者:

public static int CountOccurrencesOf(this IEnumerable<string> strings,
    string character,
    StringComparison comparison = StringComparison.CurrentCulture)
{
    Debug.Assert(character.EnumerateCharacters().Count() == 1);

    return strings
        .Select(s => s.EnumerateCharacters().Count(c => String.Equals(c, character, comparison ));
}

像这样使用:

var maximum = myStrings.CountOccurrencesOf("#").Max();

如果您需要不区分大小写:

var maximum = myStrings.CountOccurrencesOf("à", StringComparison.CurrentCultureIgnoreCase)
    .Max();

正如您现在可以想象的那样,这种比较不仅限于某些esoteric语言,但它也适用于不变区域性(en-US),那么对于必须始终与不变区域性进行比较的字符串,您应该指定StringComparison.InvariantCulture。不要忘记您可能需要致电String.Normalize()也用于输入字符。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

字符在字符串数组中出现的最大次数 的相关文章

随机推荐

  • 无效的程序计数器值:0

    我目前正在 MIPS 处理器下使用汇编语言 我现在在 使用 MARS 模拟器 由于未知的原因 我每次运行后都会收到以下错误消息 Go 运行 try s 错误 无效的程序计数器值 0 Go 执行因错误而终止 我收到此错误消息 与我正在使用的代
  • 我的 VS CODE 扩展代码运行器无法正常工作

    您好 我的问题是 在我的 Visual Studio 代码中 我的代码运行器扩展不提供任何输出 我看过很多教程 并完成了所有工作 研究 下载 Node js 并将文件保存为 JavaScript 文件并验证路径 我输入了 console l
  • 我应该将 JavaScript 放在哪里 - 页面还是外部文件?

    在 VS 2008 中 我有一个 ASP NET 内容页面 其中有一个母版页 我想为此页面添加用于客户端验证等的 JavaScript 函数 我的问题是 我应该将这些脚本单独编写吗 js文件 或嵌入到 aspx file 这种选择会影响网站
  • GCM 消息被覆盖

    我正在使用 GCM 推送通知向用户传递一些通知 我的问题是 当我发送一条消息时 如果发送多条消息 则效果很好 然后最后一条消息会显示给所有通知 我哪里做错了 private static void generateNotification
  • MonoTouch:从 Obj-C 到 MonoTouch

    我正在尝试从现有的 Objective C 项目调用 MonoTouch 程序集 我找到了这篇文章 在那里它很好地描述了这些步骤 但是当我尝试在 XCode 中构建项目时 我收到以下错误 错误 没有指定名称或路径的 SDK Develope
  • 模型关联问题

    因此 我正在实施一个向上 向下投票机制 并为其生成一个模型 到目前为止 我了解到一个视频 将投票的内容 有一个 vote count 而 vote count 属于视频 但是 我还想在 vote count 数据库中跟踪对视频投票的用户 这
  • 为什么我的 LINQ INSERTS 没有在 SQL Server CE 3.5 中保留?

    我将 LINQ to SQL 与 Sql Server Compact Edition 3 5 和 VS2008 一起使用 我有一个非常简单的表 Tokens 其中包含唯一标识符主键 TokenID 和其他两个可为空的字段 UsedBy 和
  • RecyclerView 在新行中显示以前在 EditText 中输入的值

    我正在创建一个 Android 应用程序 我在其中使用recyclerView并且 recyclerView 的行有editText 这是我的ReadingAdapter class public class ReadingAdapter
  • 如何在jdbc postgresql准备好的语句中多次使用相同的值

    有没有办法在 jdbc postgresql 驱动程序的准备语句中多次使用相同的变量 例如 我想使用以下语句 但每个问号具有相同的值 PreparedStatement ps pg prepareCall SELECT FROM mytab
  • xsl for-each:每 n 行添加代码块?

    我正在尝试将一些代表图像库的 xml 转换为 html 表 必须使用 html 而不是 css 来完成 如何添加换行符 tr 每六列左右有 xsl 吗 我有这个 tr
  • 旋转SCNNode相对局部坐标

    我正在尝试旋转节点SCNAction 但它相对于父级的坐标空间旋转 是否可以相对局部坐标系旋转节点 当然 您可以使用以下命令获取父级旋转轴的空间坐标转换向量 method 例如 此操作将绕局部 x 轴旋转 180 度 SCNAction r
  • Linq 中的三元运算符

    var result from payroll in currentMonthPayroll select new SalaryDifference PreviousMonthSalary previousMonthPayroll Wher
  • 静态和非静态字段

    只是为了澄清我的想法是对的 在java中静态字段是一个被整个类使用的变量 字段 或者可以被引用该类的所有对象使用 非静态字段是由对象定义的变量吗 引用与对象 1 相同的类的第二个对象可以具有与对象 1 的静态字段不同的值吗 与实例变量不同
  • 合并日期范围

    这里是 Oracle SQL 新手 也是第一次发布海报 我以为这很简单 直到我意识到我无法弄清楚如何拆分返回作业 这是我的分配表 ASGN ID ST DT END DT POS LOCN STATUS WAGE CD A 12 31 20
  • 如何回显公共文件夹之外的图像

    在此项目中 我将管理员提交的文件上传到公共文件夹之外的文件夹 web the public folder upload uploading image to this which is at the same level as the pu
  • 在 ggplot2 中显示频率和条形图

    我正在尝试在条形图中显示频率 好吧 我想要它们某处在图表中 条形下方 条形内 条形上方或图例区域中 我记得 我可能是错的 它可以在ggplot2 这可能是一个简单的问题 至少看起来很容易 这是代码 p lt ggplot mtcars p
  • 使用方法 update_all

    假设我有一个模型 class Result lt ActiveRecord Base attr accessible x y sum end 而不是做 Result all find each do s s sum compute sum
  • 编写一个批处理文件以按日期和时间删除文件夹

    精确重复 如何编写批处理文件来删除文件夹中 5 天或更早的文件 编写一个批处理文件以从文件夹中删除 6 天前的文件 编写一个批处理文件以从文件夹中删除 5 天前的文件 如何编写批处理文件来定期删除文件夹和文件 如何创建按计划删除文件夹的批处
  • 如何在 Web 组件中使用标签的 querySelector

    我正在使用 Web 组件和普通 javascript 构建一个应用程序 我想使用 vaadin router 进行路由 In my 索引 html我只显示Web组件app module
  • 字符在字符串数组中出现的最大次数

    在 C 中 给定数组 string myStrings new string test test test Winner outputs 6 如何找到该字符出现的最大次数 出现在单个字符串中 我当前的解决方案是 int maxOccurre