我正在尝试在字符串中循环遍历字符。
string cycleMe = "Hi StackOverflow! Here is my string."
但是,我想跳过某些范围的索引。我要跳过的范围存储在对象列表delims中。
List<Delim> delims = delimCreator();
要检索某个范围的每个开始索引和结束索引,我必须编写一个访问每个“ delim”的循环:
delims[0].getFirstIndex() //results in, say, index 2
delims[0].getLastIndex() //results in, say, index 4
delims[1].getFirstIndex() //results in, say, index 5
delims[1].getLastIndex() //results in, say, index 7
(正在播放的物体可能无限多)
如果上面是我的列表,我想打印字符串cycleMe,但是跳过2至4(含)和5至7(含)之间的所有字符。
使用上述数字的预期输出:
HiOverflow! Here is my string.
这是我到目前为止编写的代码。它循环的次数比我预期的要多得多(它使字符串中的字符数循环〜2倍)。提前致谢! =)
List<Delim> delims = delimAggregateInator(displayTextRaw);
for (int x = 0; x < cycleMe.Length;x++){
for (int i = 0; i < delims.Count; i++){
if (!(x >= delims[i].getFirstIndex() && x <= delims[i].getLastIndex())){
Debug.Log("test");
}
}
答案 0 :(得分:3)
我认为,跳过表示您想从原始字符串中省略那些字符。在这种情况下,您可以尝试如下所示的Aggregate扩展方法。
string result = delims.Aggregate<Delim, string>(cycleMe, (str, d) => cycleMe = cycleMe.Remove(d.FirstIndex, (d.LastIndex - d.FirstIndex) + 1));
确保delim列表的顺序正确。
答案 1 :(得分:1)
解决方案可能是将字符串转换为char数组,将所需的部分替换为空格,然后将输出转换回字符串。
这是您代码的修改版本:
string cycleMe = "Hi StackOverflow! Here is my string."
var charArray = cycleMe.ToCharArray(); // Converting to char array
List<Delim> delims = delimAggregateInator(displayTextRaw);
for (int x = 0; x < cycleMe.Length;x++){
for (int i = 0; i < delims.Count; i++){
// ORIGINAL: if (!(x >= delims[i].getFirstIndex() && x <= delims[i].getLastIndex())){
if (x >= delims[i].getFirstIndex() && x <= delims[i].getLastIndex()){
Debug.Log("test");
charArray[x] = ' '; // Replacing the item with space
}
}
string output = new string(charArray); // Converting back to string
P.S。这可能不是最佳解决方案,但至少它应该可以工作。
答案 2 :(得分:1)
您应该为此使用LINQ
struct Delim
{
public int First { get; set; }
public int Last { get; set; }
}
static void Main(string[] args)
{
string cycleMe = "Hi StackOverflow! Here is my string.";
var delimns = new List<Delim> { new Delim { First=2, Last=4}, new Delim { First = 5, Last = 7 } };
var cut = cycleMe.Where((c, i) =>
!delimns.Any(d => i >= d.First && i <= d.Last));
Console.WriteLine(new string(cut.ToArray());
}
这意味着我基本上只是在不属于任何切割范围的位置上选择字母。
也:修改您的命名。分隔符是字符,而不是位置(数字)