【问题标题】:Find all index numbers of a value in array [duplicate]查找数组中某个值的所有索引号[重复]
【发布时间】:2014-09-16 09:18:33
【问题描述】:

如何查找数组中某个值的所有位置

   class Program
    {
        static void Main(string[] args)
        {
            int start = 0;
           int[] numbers = new int[7] { 2,1,2,1,5,6,5};
    }

【问题讨论】:

标签: c# arrays search


【解决方案1】:

类似的东西:

  int[] numbers = new [] { 2, 1, 2, 1, 5, 6, 5 };
  int toFind = 5;

  // all indexes of "5" {4, 6}
  int[] indexes = numbers
    .Select((v, i) => new {
      value = v,
      index = i
    })
    .Where(pair => pair.value == toFind)
    .Select(pair => pair.index)
    .ToArray();

【讨论】:

    【解决方案2】:
    List<int> indexes = new List<int>();
    for (int i = 0; i < numbers.Length; i++)
    {
        if (numbers[i] == yourNumber)
            indexes.Add(i);
    }
    

    【讨论】:

      【解决方案3】:

      用途是:Array.indexOf(T,value)

      请参考下面的msdn。

      http://msdn.microsoft.com/en-us/library/system.array.indexof(v=vs.110).aspx

      【讨论】:

        【解决方案4】:

        您可以为序列创建一个非常简单的扩展方法来执行此操作:

        public static class SequenceExt
        {
            public static IEnumerable<int> IndicesOfAllElementsEqualTo<T>
            (
                this IEnumerable<T> sequence, 
                T target
            )   where T: IEquatable<T>
            {
                int index = 0;
        
                foreach (var item in sequence)
                {
                    if (item.Equals(target))
                        yield return index;
        
                    ++index;
                }
            }
        }
        

        扩展方法适用于List&lt;&gt;、数组、IEnumerable&lt;T&gt; 和其他集合。

        那么您的代码将如下所示:

        var numbers = new [] { 2, 1, 2, 1, 5, 6, 5 };
        
        var indices = numbers.IndicesOfAllElementsEqualTo(5); // Use extension method.
        
        // Make indices into an array if you want, like so
        // (not really necessary for this sample code):
        
        var indexArray = indices.ToArray();
        
        // This prints "4, 6":
        Console.WriteLine(string.Join(", ", indexArray));
        

        【讨论】:

        • 我宁愿将扩展方法的签名更改为IEnumerable&lt;int&gt; IndicesOfAllElementsEqualTo&lt;T&gt;(this IEnumerable&lt;T&gt; sequence, Func&lt;T, Boolean&gt; map),以便更通用
        【解决方案5】:

        Linq 可以提供帮助

        var indexes = numbers
          .Select((x, idx) => new { x, idx })
          .Where(c => c.x == number)
          .Select(c => c.idx);
        

        【讨论】:

        • 这是对集合的相当多的迭代
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-07-31
        • 2017-03-08
        • 1970-01-01
        • 2015-01-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多