2010-06-30 8 views
14

मैं Linq उपयोग करने के लिए एक 2 डी सरणी क्वेरी करना चाहते हैं नहीं मिला का चयन करें, लेकिन मैं कोई त्रुटि मिलती है:2 डी सरणी के साथ LINQ का उपयोग कर,

Could not find an implementation of the query pattern for source type 'SimpleGame.ILandscape[,]'. 'Select' not found. Are you missing a reference to 'System.Core.dll' or a using directive for 'System.Linq'?

कोड पीछा कर रहा है:

var doors = from landscape in this.map select landscape; 

मैं देख लिया है कि मैंने संदर्भ System.Core और System.Linq का उपयोग किया था।

क्या कोई भी कुछ संभावित कारण दे सकता है?

+0

इसके अलावा, यह .map IENumerable/IQueryable लागू करता है? –

+0

@ मैथ्यू एबॉट: ठीक है, यह 2 डी सरणी है, इसलिए मुझे लगता है कि माइक्रोसॉफ्ट में कुछ लोगों ने इसे लागू किया है। – LLS

+0

संभावित डुप्लिकेट [सी # बहुआयामी arrays क्यों नहीं लागू करता है Inumerable ?] (Http://stackoverflow.com/questions/275073/why-does-c-multidimensional-arrays-not-implement-ienumerablet) – ChrisF

उत्तर

22

आदेश LINQ के साथ अपने बहुआयामी सरणी का उपयोग करने के लिए, आप बस इसे IEnumerable<T> में बदलने की जरूरत है। यह पर्याप्त नहीं है, यहाँ

int[,] array = { { 1, 2 }, { 3, 4 } }; 

var query = from int item in array 
      where item % 2 == 0 
      select item; 

var query2 = from item in array.Cast<int>() 
       where item % 2 == 0 
       select item; 

प्रत्येक वाक्य रचना की क्वेरी एक IEnumerable<T> में 2 डी सरणी में परिवर्तित कर देंगे (क्योंकि आप खंड से एक या array.Cast<int>() अन्य में में कहते हैं कि int item) के लिए दो उदाहरण विकल्प हैं आसान है। फिर आप LINQ विधियों का उपयोग करके इच्छित प्रक्षेपण को फ़िल्टर, चयन या निष्पादित कर सकते हैं।

+1

+1 मेरा से अधिक संक्षिप्त (जब तक आपको कस्टम गणना व्यवहार की आवश्यकता नहीं है); –

+0

धन्यवाद। मुझे लगता है कि मैं बहुआयामी सरणी में foreach का उपयोग कर सकते हैं, और सी # भी foreach काम करने के लिए इसे IENumerable में परिवर्तित कर देता है? – LLS

+1

@ एलएलएस, 'पूर्वानुमान' लूपिंग संरचना के लिए 'IENumerable 'की आवश्यकता नहीं है। 'ऐरे' 'inumerable' लागू करता है, और यह आवश्यकता को फिट करता है। Foreach के लिए, संरचना को एक समेकित इंटरफ़ेस ('IENumerable' या' IEnumerable ') के लिए लागू रूप से परिवर्तनीय/लागू करने की आवश्यकता है या उचित 'GetEnumerator' और' MoveNext' विधियां हैं)। अधिक जानकारी के लिए सी # भाषा विनिर्देश के खंड 8.8.4 देखें। –

11

आपका मानचित्र एक बहुआयामी सरणी है - इन का समर्थन नहीं करते LINQ क्वेरी संचालन (देखें अधिक Why do C# Multidimensional arrays not implement IEnumerable<T>?)

आप कई कारणों के लिए जाने के लिए या तो शायद सबसे अच्छा तरीका है अपने सरणी के लिए भंडारण (समतल करने की आवश्यकता होगी) या इसके लिए कुछ कस्टम गणन कोड लिखें:

public IEnumerable<T> Flatten<T>(T[,] map) { 
    for (int row = 0; row < map.GetLength(0); row++) { 
    for (int col = 0; col < map.GetLength(1); col++) { 
     yield return map[row,col]; 
    } 
    } 
} 
+0

मैंने केवल GetEnumerator में उपज वापसी देखी, क्या यह एक आईनेमेरेबल वापस करने के लिए भी काम करता है? – LLS

+0

निश्चित रूप से, इसे जाने दो! –