c# Array.FindAllIndexOf which FindAll IndexOf

后端 未结 9 1917
佛祖请我去吃肉
佛祖请我去吃肉 2020-11-29 08:16

I know c# has Array.FindAll and Array.IndexOf.

Is there a Array.FindAllIndexOf which returns int[]?

相关标签:
9条回答
  • 2020-11-29 08:36
    string[] myarr = new string[] {"s", "f", "s"};
    
    int[] v = myarr.Select((b,i) => b == "s" ? i : -1).Where(i => i != -1).ToArray();
    

    This will return 0, 2

    If the value does not exist in the array then it will return a int[0].

    make an extension method of it

    public static class EM
    {
        public static int[] FindAllIndexof<T>(this IEnumerable<T> values, T val)
        {
            return values.Select((b,i) => object.Equals(b, val) ? i : -1).Where(i => i != -1).ToArray();
        }
    }
    

    and call it like

    string[] myarr = new string[] {"s", "f", "s"};
    
    int[] v = myarr.FindAllIndexof("s");
    
    0 讨论(0)
  • 2020-11-29 08:41

    I know this is an old post, but you can try the following,

    string[] cars = {"Volvo", "BMW", "Volvo", "Mazda","BMW","BMW"};
    var res = Enumerable.Range(0, cars.Length).Where(i => cars[i] == "BMW").ToList();
    

    returns {1,4,5} as a list

    0 讨论(0)
  • 2020-11-29 08:43

    You can solve this problem by creating only 2 integer variables. More power to you!

    string[] seasons= { "Fall","Spring", "Summer", "Fall", "Fall", "Winter"};
    
    int i = 0;
    
    int IndexOfFallInArray = 0;
    
    int[] IndexesOfFall= new int[seasons.Length];
    
    foreach (var item in seasons)
    {
        if (item == "Fall")
            {
                IndexesOfFall[i] = IndexOfFallInArray;
                i++;
            }
            IndexOfFallInArray++;
    }
    
    0 讨论(0)
  • 2020-11-29 08:48

    I've used Nikhil Agrawal's answer to create the following related method, which may be useful.

    public static List<int> FindAllIndexOf<T>(List<T> values, List<T> matches)
        {
            // Initialize list
            List<int> index = new List<int>();
    
            // For each value in matches get the index and add to the list with indexes
            foreach (var match in matches)
            {
                // Find matches 
                index.AddRange(values.Select((b, i) => Equals(b, match) ? i : -1).Where(i => i != -1).ToList());
    
            }
    
            return index;
        }
    

    Which takes a list with values and a list with values that are to be matched. It returns a list of integers with the index of the matches.

    0 讨论(0)
  • 2020-11-29 08:50

    You can loop with findIndex giving an index

    string[] arr = { "abc", "asd", "def", "abc", "lmn", "wer" };
    int index = -1;
    do
    {
        index = Array.IndexOf(arr, "abc", index + 1);
        System.Console.WriteLine(index);
    } while (-1 != index);
    
    0 讨论(0)
  • 2020-11-29 08:54

    Searches for an element that matches the conditions defined by the specified predicate, and returns all the zero-based index of the occurrence within the entire System.Array.

    public static int[] FindAllIndex<T>(this T[] array, Predicate<T> match)
    {
        return array.Select((value, index) => match(value) ? index : -1)
                .Where(index => index != -1).ToArray();
    }
    
    0 讨论(0)
提交回复
热议问题