2010-07-15 15 views
7

खैर सरल प्रश्न यहाँ (शायद नहीं एक सरल जवाब?)एक द्वि-आयामी सरणी में किसी तत्व की स्थिति ढूँढना?

मैं एक दो आयामी सरणी

[0] [1] [2] 
[3] [4] [5] 
[6] [7] [8] 

अब मान लीजिए है कहो मैं नंबर 6

मुझे पता है की स्थिति को प्राप्त करना चाहते हैं एक-आयामी सरणी के साथ मैं Array.indexOf() का उपयोग कर सकता हूं लेकिन मेरे विकल्प 2-आयामी सरणी के साथ क्या होगा?

धन्यवाद!

+0

मुझे लगता है कि आप एक 2 डी सरणी मतलब ('पूर्णांक [,]'), नहीं एक दांतेदार सरणी ('पूर्णांक [] []') – SLaks

उत्तर

19

मैं इस तरह कुछ कहना चाहते हैं:

public static Tuple<int, int> CoordinatesOf<T>(this T[,] matrix, T value) 
{ 
    int w = matrix.GetLength(0); // width 
    int h = matrix.GetLength(1); // height 

    for (int x = 0; x < w; ++x) 
    { 
     for (int y = 0; y < h; ++y) 
     { 
      if (matrix[x, y].Equals(value)) 
       return Tuple.Create(x, y); 
     } 
    } 

    return Tuple.Create(-1, -1); 
} 
+0

इस तरह की स्थितियों में मैं टुपल का उपयोग करने के बजाय परिणाम का प्रतिनिधित्व करने के लिए एक वर्ग बनाना पसंद करता हूं क्योंकि टुपल यह नहीं बताता कि क्या वापस किया जा रहा है। निश्चित रूप से जब आप लाइन ट्यूपल समन्वय = matrix.CoordinatesOf (5) पर देख रहे हैं तो आप आसानी से अनुमान लगा सकते हैं कि यह एक समन्वय/बिंदु है लेकिन एक बार जब यह मान सिस्टम के माध्यम से चलता है तो यह केवल एक टुपल बन जाता है जो कुछ गरीब देव को ट्रैक करने के लिए छोड़ देता है सीखने के लिए स्रोत क्या ट्यूपल वास्तव में प्रतिनिधित्व करता है। –

1

यहाँ एक विधि है कि एक मनमाना रैंक के साथ एक सरणी में एक सूचकांक खोजना चाहिए है।

... जोड़ा गया ऊपरी रैंक प्रति/लोअर सीमा रेंज

public static class Tools 
{ 
    public static int[] FindIndex(this Array haystack, object needle) 
    { 
     if (haystack.Rank == 1) 
      return new[] { Array.IndexOf(haystack, needle) }; 

     var found = haystack.OfType<object>() 
          .Select((v, i) => new { v, i }) 
          .FirstOrDefault(s => s.v.Equals(needle)); 
     if (found == null) 
      throw new Exception("needle not found in set"); 

     var indexes = new int[haystack.Rank]; 
     var last = found.i; 
     var lastLength = Enumerable.Range(0, haystack.Rank) 
            .Aggregate(1, 
             (a, v) => a * haystack.GetLength(v)); 
     for (var rank =0; rank < haystack.Rank; rank++) 
     { 
      lastLength = lastLength/haystack.GetLength(rank); 
      var value = last/lastLength; 
      last -= value * lastLength; 

      var index = value + haystack.GetLowerBound(rank); 
      if (index > haystack.GetUpperBound(rank)) 
       throw new IndexOutOfRangeException(); 
      indexes[rank] = index; 
     } 

     return indexes; 
    } 
} 
+0

यह बहुत साफ है, लेकिन 'ToList' कॉल मुझे थोड़ी आलसी के रूप में मारता है ... क्यों 'इंडेक्सऑफ'' का उपयोग करने के लिए एक बहुआयामी सरणी की संपूर्ण सामग्री को 'सूची ' पर कॉपी करें? आप अपना खुद का लिख ​​सकते हैं जो सरणी में जगह पर गणना करता है। –

+0

अच्छा बिंदु। मैं सीमा सीमाओं को समर्थन जोड़ने के बारे में सोच रहा था, वैसे भी मैं इसे बदल दूंगा। –

संबंधित मुद्दे