Finding multiple indexes from source string

后端 未结 4 1565
眼角桃花
眼角桃花 2021-01-12 21:23

Basically I need to do String.IndexOf() and I need to get array of indexes from the source string.

Is there easy way to get array of indexes?

Before asking t

相关标签:
4条回答
  • 2021-01-12 21:47
        var indexs = "Prashant".MultipleIndex('a');
    
    //Extension Method's Class
        public static class Extensions
        {
             static int i = 0;
    
             public static int[] MultipleIndex(this string StringValue, char chChar)
             {
    
               var indexs = from rgChar in StringValue
                            where rgChar == chChar && i != StringValue.IndexOf(rgChar, i + 1)
                            select new { Index = StringValue.IndexOf(rgChar, i + 1), Increament = (i = i + StringValue.IndexOf(rgChar)) };
                i = 0;
                return indexs.Select(p => p.Index).ToArray<int>();
              }
        }
    
    0 讨论(0)
  • 2021-01-12 21:50

    Using a solution that utilizes regex can be more reliable, using the indexOf function can be unreliable. It will find all matches and indexes, not matching an exact phrase which can lead to unexpected results. This function resolves that by making use of the Regex library.

    public static IEnumerable<int> IndexesOf(string haystack, string needle)
    {
           Regex r = new Regex("\\b(" + needle + ")\\b");
           MatchCollection m = r.Matches(haystack);
    
           return from Match o in m select o.Index;
    }
    
    0 讨论(0)
  • 2021-01-12 21:55

    You would have to loop, I suspect:

            int start = 0;
            string s = "abcdeafghaji";
            int index;
            while ((index = s.IndexOf('a', start)) >= 0)
            {
                Console.WriteLine(index);
                start = index + 1;
            }
    
    0 讨论(0)
  • 2021-01-12 22:00

    How about this extension method:

    public static IEnumerable<int> IndexesOf(this string haystack, string needle)
    {
        int lastIndex = 0;
        while (true)
        {
            int index = haystack.IndexOf(needle, lastIndex);
            if (index == -1)
            {
                yield break;
            }
            yield return index;
            lastIndex = index + needle.Length;
        }
    }
    

    Note that when looking for "AA" in "XAAAY" this code will now only yield 1.

    If you really need an array, call ToArray() on the result. (This is assuming .NET 3.5 and hence LINQ support.)

    0 讨论(0)
提交回复
热议问题