跳过for循环C#

时间:2020-03-10 06:34:05

标签: c# .net loops object logic

我正在尝试在字符串中循环遍历字符。

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");


      }
    }

3 个答案:

答案 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());
        }

这意味着我基本上只是在不属于任何切割范围的位置上选择字母。

也:修改您的命名。分隔符是字符,而不是位置(数字)