我正在做一个吉他图表在WPF和我想显示相应的和弦鼠标悬停。(在一个信息箱里可以)
我已经在一个名为: cursorPos的Int中有我的光标位置,它返回字符串中悬浮字母位置的编号。
我的问题是我需要整体和弦在和之间
我的字符串看起来如下:string myString = "[Em] I've been a m[C]iner for a h[D]eart of g[G]old."
在这种情况下,一个19,20或21的"cursorPos“会给我C
顺便说一句。和弦可以有从1到10字母(如G#m9(maj7))
发布于 2020-07-07 19:07:54
首先,您需要找到所有和弦的实例(即字符串中的[和]之间的子字符串)。有很多种方法可以做到这一点,这就是一个适合你的情况的例子。当然,这是假设您没有嵌套括号。
首先,我用一个类来保存你们的每个和弦。IsInRange()方法将告诉您chord是否在您传递给它的光标位置。
public class Chord
{
public string Value { get; set; }
public int Start { get; set; }
public int End { get; set; }
public bool IsInRange(int cursorPos)
{
return cursorPos >= Start && cursorPos <= End;
}
}现在,让我们编写一个函数来提取字符串中的所有和弦。
static List<Chord> GetChords(string str)
{
var chords = new List<Chord>();
var chord = new Chord();
var count = 0;
foreach (var ch in str)
{
if (ch == '[')
{
chord = new Chord
{
Start = count
};
chord.Value += ch;
}
else if (ch == ']')
{
chord.End = count;
chord.Value += ch;
chords.Add(new Chord() { Value = chord.Value, Start = chord.Start, End = chord.End });
chord = null;
}
else
{
if (chord != null)
chord.Value += ch;
}
count++;
}
return chords;
}现在,您可以传递任何字符串并得到和弦,并使用IsInRange()函数检查给定的光标位置是否与和弦相对应。
string myString = "[Em] I've been a m[C]iner for a h[D]eart of g[G#m9(maj7)]old.";
var chords = GetChords(myString);让我们看看光标位置19是否返回任何东西。
var chordAt19 = chords.FirstOrDefault(x => x.IsInRange(19));因为我们在19岁时确实有和弦,所以它会回复它。如果没有(例如,如果我们将12传递给它),它将返回null。
https://stackoverflow.com/questions/62781107
复制相似问题