0

我在这里找到了一段非常好的代码 https://stackoverflow.com/a/45979883/9138729

我很难让它在我的 C# 表单应用程序中工作

function transposeChord(chord, amount) {
    var scale = ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"];
    var normalizeMap = {
        "Cb": "B",
        "Db": "C#",
        "Eb": "D#",
        "Fb": "E",
        "Gb": "F#",
        "Ab": "G#",
        "Bb": "A#",
        "E#": "F",
        "B#": "C"
    };
    return chord.replace(/[CDEFGAB](b|#)?/g, function(match) {
        matchIndex = normalizeMap[match] ? normalizeMap[match] : match;
        var i = (scale.indexOf(matchIndex) + amount) % scale.length;
        if (i < 0) {
            return scale[i + scale.length];
        } else {
            return scale[i];
        }
        }
    );
}
  1. normalizeMap var 每行有 2 个选项(字符串 [,]?)。
  2. C# 中的替换功能不适用于 "(b|#)?/g" 部分(我认为)
  3. 函数(匹配)存在于 C# 中吗?

还是我需要采用全新的方法来适应 C# 逻辑?

4

1 回答 1

0

代码解决:

        private string transposeChord(string ChordRegel, int amount)
    {
        string[] scale = { "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B" };
        var normalizeMap = new Dictionary<string, string>() { { "Cb", "B" }, { "Db", "C#" }, { "Eb", "D#" }, { "Fb", "E" }, { "Gb", "F#" }, { "Ab", "G#" }, { "Bb", "A#" }, { "E#", "F" }, { "B#", "C" } };
        return new Regex("[CDEFGAB](b|#)?").Replace(ChordRegel, match =>
        {
        int i = (Array.IndexOf(scale, normalizeMap.ContainsKey(match.Value) ? normalizeMap[match.Value] : match.Value) + amount) % scale.Length;
            return scale[i < 0 ? i + scale.Length : i];
        });
    }
于 2017-12-27T16:54:54.700 回答