- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
给定以下字符串列表:
string[] Itens = new string[] { "hi", " hi ", "HI", "hí", " Hî", "hi hi", " hí hí ", "olá", "OLÁ", " olá ", "", "ola", "hola", " holà ", "aaaa", "áâàa", " aâàa ", "áaàa", "áâaa ", "aaaa ", "áâaa", "áâaa", };
Distinct 操作的结果应该是:
hi, hi hi, olá, , hola, aaaa
可用于 IEnumerable 的 C# 的 Distinct 操作接受 IEqualityComparer 作为参数,因此我们可以个性化比较。
下面的实现完成了工作
class LengthHash : IEqualityComparer<string>
{
public bool Equals(string x, string y)
{
if (x == null || y == null) return x == y;
var xt = x.Trim();
var yt = y.Trim();
return xt.Length == yt.Length && Culture.CompareInfo.IndexOf(xt, yt, CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreCase) >= 0;
}
public int GetHashCode(string obj) => obj?.Trim().Length ?? 1;
}
如果 GetHashCode 不同,Equals 甚至不会执行,因此有一个好的实现很重要。
我尝试将 GetHashCode 更改为其他 2 种不同的方法。
忽略哈希
public int GetHashCode(string obj) => 1;
标准化哈希
public int GetHashCode(string obj) => obj?.Trim().Normalize().ToUpperInvariant().GetHashCode() ?? 1;
// obs: This approach doesn't produce the same output.
除了使用个性化的 IEqualityComparer,我还尝试在执行 StringComparer.InvariantCultureIgnoreCase 之前修剪列表,但它产生与 Normalize 和 Upper 版本相同的输出。
对纯 Distinct、StringComparer.InvariantCultureIgnoreCase 和 3 种个性化方法进行基准测试会产生以下结果:
Method | Mean | StdErr | StdDev | Median |
------------------------------------ |----------- |---------- |---------- |----------- |
RunDefault | 2.2224 us | 0.0242 us | 0.2391 us | 2.1414 us |
RunHashAsLength | 6.0765 us | 0.0515 us | 0.1857 us | 6.1235 us |
RunIgnoreHash | 6.4078 us | 0.0640 us | 0.6140 us | 6.1982 us |
RunNormalizedHash | 14.5941 us | 0.0742 us | 0.3556 us | 14.4983 us |
RunTrimAndCompareWithStringComparer | 14.4935 us | 0.0213 us | 0.0768 us | 14.5352 us |
输出是:
21 Default: hi, hi , HI, hí, Hî, hi hi, hí hí , olá, OLÁ, olá , , ola, hola, holà , aaaa, áâàa, aâàa , áaàa, áâaa , aaaa , áâaa
6 HashAsLength: hi, hi hi, olá, , hola, aaaa
6 IgnoreHash: hi, hi hi, olá, , hola, aaaa
15 NormalizedHash: hi, hí, Hî, hi hi, hí hí , olá, , ola, hola, holà , aaaa, áâàa, aâàa , áaàa, áâaa
15 RunTrimAndCompareWithStringComparer: hi, hí, Hî, hi hi, hí hí, olá, , ola, hola, holà, aaaa, áâàa, aâàa, áaàa, áâaa
您可以在 https://gist.github.com/Flash3001/d50a6b43bba7bc61e3d85734e40dbed9 中找到完整的测试
问题是:是否有更好的方法来获得所需的最终列表?无论是不同的 GetHashCode、Equals 还是其他预定义的 IEqualityComparer。
最佳答案
您可以使用CompareInfo
类、Compare
和GetHashCode
提供的指定方法。这样您就可以确保实现是一致的。正确性是第一位的。性能是次要的。
class StringEqualityComparer : IEqualityComparer<string>
{
private CultureInfo _cultureInfo;
private CompareOptions _options;
private bool _trim;
public StringEqualityComparer(CultureInfo cultureInfo,
CompareOptions options, bool trim)
{
_cultureInfo = cultureInfo;
_options = options;
_trim = trim;
}
public bool Equals(string x, string y)
{
if (_trim) { x = x?.Trim(); y = y?.Trim(); }
return _cultureInfo.CompareInfo.Compare(x, y, _options) == 0;
}
public int GetHashCode(string obj)
{
if (_trim) obj = obj?.Trim();
return _cultureInfo.CompareInfo.GetHashCode(obj, _options);
}
}
使用示例:
var comparer = new StringEqualityComparer(CultureInfo.InvariantCulture,
CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreCase, true);
var items = new string[] { "hi", " hi ", "HI", "hí", " Hî", "hi hi", " hí hí ",
"olá", "OLÁ", " olá ", "", "ola", "hola", " holà ", "aaaa", "áâàa",
" aâàa ", "áaàa", "áâaa ", "aaaa ", "áâaa", "áâaa", };
Console.WriteLine($"Distinct: {String.Join(", ", items.Distinct(comparer))}");
输出:
Distinct: hi, hi hi, olá, , hola, aaaa
关于c# - 区分忽略空格、变音符号和大小写的字符串列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43106492/
基本上,我想在音序器播放时实时获取并显示 MIDI 音符(轨道、音符和 Octave )的数据。 我希望能够将其添加到以下代码中: Sequencer sequencer = MidiSystem.g
播放我使用的是 AVAudioUnitSampler: sampler.stopNote(note, onChannel: channel) 但要停止我不想使用:
一个接一个地弹奏音符的最佳方式是什么?这是我现在拥有的最实用的代码。 let majorScale = [60, 62, 64, 65, 67, 69, 71, 72] for i i
我正在尝试构建一个程序,使用 Java Sound API (javax.sound.midi) 在合成器播放时在屏幕上显示 MIDI 音符。 MIDI 文件需要从磁盘加载,但我在将音序器连接到合成器
我已经搜索过并且已经完成了一个可以播放 MIDI 音符的 OS X 应用程序,但是当我在 iOS 中尝试时,没有任何反应。这是核心代码: AUGraph graph; AudioUnit synthU
我正在开发一个 iOS 音乐应用程序(用 C++ 编写),我的模型看起来或多或少像这样: --Song ----Track ----Track ------Pattern ------Pattern
我正在尝试构建一个系统,该系统将能够处理某人吹口哨的记录并输出注释。 谁能推荐一个开源平台,我可以将其用作音符/音高识别和波形文件分析的基础? 提前致谢 最佳答案 正如其他许多人已经说过的那样,FFT
我正在尝试使用 AUSampler 音频单元 在 sf2 文件的帮助下播放 midi 音符。我能够使用 MusicDeviceMIDIEvent 函数开始和停止音符,如下所示。 noteCommand
我需要在我的应用中同时播放多个轨道。音轨可以是普通音频文件或一组 MIDI 音符。因此,我配置了音频图并将各种音频单元(文件播放器 AU 和采样器 AU)连接到多 channel 混音器,其输出连接到
我正在开发一个适用于 iOS 的琶音器应用程序,它能够将无限的音符序列发送到外部 MIDI 兼容的硬件合成器。我使用 AudioKit 来接收和发送 MIDI 信息。 我的工作室设置包括 E-RM 多
我正在对一种似乎是带有音色库的 MIDI 的音乐格式进行逆向工程。 但是我无法使我的实现听起来正确,因为我不知道如何以给定的 MIDI 音符播放音库中的样本(我只是以它们的原始 khz 播放它们)。
澄清一下:我不想生成 MIDI 文件,也不想播放 MIDI 文件,我希望即时播放 MIDI 音符。 我尝试使用 https://github.com/mudcube/MIDI.js作为 MIDI 库,
我正在开发一个具有多个“触摸区域”的玩具,这些区域用作我的合成器的输入。 使用 oscillatorBank 我可以轻松地开始和停止音符。 在常规键盘中,每个 Midi 音符只有 1 个键,因此“重新
正在为 android 开发一个简单的键盘。我发现来自 Google 的 android-midi-lib 非常有用和强大,但在我看来它只能播放 midi 文件,但不能在键盘上按下时播放实时 midi
所以我觉得自己像个白痴,因为我必须在这里发帖来解决可能是简单的修复问题。我正在编写一个将 MIDI 发送到另一个应用程序的 iOS 应用程序。对于我的第一个概念证明,我试图在我的 iPhone 上向
我正在制作一个 C# 程序,它应该从 MIDI 文件中读取每个音符并获取音符的长度和速度,但我不知道该怎么做... 我正在使用 DryWetMidi图书馆,但还有其他图书馆吗? 最佳答案 以 DryW
我正在制作一个 C# 程序,它应该从 MIDI 文件中读取每个音符并获取音符的长度和速度,但我不知道该怎么做... 我正在使用 DryWetMidi图书馆,但还有其他图书馆吗? 最佳答案 以 DryW
我希望使用 Swift 在 iOS 应用程序上播放单个 midi 音符。 这是我目前所拥有的,但不幸的是,这会因错误而崩溃。 func initAudio(){ let engine = AV
我儿子弹奏的弦乐器听起来非常走调。我更希望他学习一些简单的 Python 编程来演奏真正听起来像 do-re-mi 的 do-re-mi 音符。 首先,我想在 Python 上玩 do-re-mi,每
我正在使用 Arduino Yun 和 MIDI 转 USB 接口(interface),我的目标是在已安装的 Linux 操作系统上读取传入的 MIDI 音符。 目标是让 Yun 上的计算机读取音符
我是一名优秀的程序员,十分优秀!