2009-05-05 12 views
6

मेरे पास दो क्षेत्र, "startLocation" और "endLocation" वाले "क्षेत्र" वर्ग की एक सूची < है। मैं उन दोनों को एक नए क्रमबद्ध 2 आयामी सरणी में जोड़ना चाहता हूं जहां इसकी बस स्थान और एक पूर्णांक यह दर्शाता है कि इसकी शुरुआत या अंत है या नहीं।सी # - 2-आयामी सरणी में दो चर लेने के लिए LINQ का उपयोग करना?

उदाहरण के लिए, यदि सूची के साथ

[क्षेत्र 1] तीन क्षेत्र वस्तुएं हैं: startLocation = 5, endLocation = 7

[क्षेत्र 2]: startLocation = 3, endLocation = 5

[क्षेत्र 3]: startLocation = 8, endLocation = 9

मैं एक हल कर दो आयामी सरणी प्राप्त करने के लिए (या सूची या समान) की तरह लग रही करना चाहते हैं:

[3] [1]

[5] [1]

[5] [-1]

[7] [-1]

[8] [1]

[9] [-1]

(अधिमानतः मैं अपने दूसरे मानों को एक साथ जोड़ने के लिए है, तो दो अलग-अलग 5 सरणी में की [5 0] में जोड़ा जा होगा ओवरलैप करना चाहते हैं ... लेकिन वह भी महत्वपूर्ण नहीं है)

मैं मैं वर्तमान में नियमित रूप से एक-एक करके प्रत्येक के माध्यम से जा रहा हूं और उन्हें एक समय में एक सूची में जोड़ रहा हूं। यह कार्यान्वयन काफी धीमा है क्योंकि मैं बड़े डेटासेट के साथ काम कर रहा हूं, और मुझे लगता है कि LINQ के माध्यम से इसे पूरा करने के लिए एक और अधिक सुरुचिपूर्ण/तेज़ तरीका है।

किसी भी सुझाव की बहुत सराहना की जाएगी।

उत्तर

5

आप एक सहायक विधि है जो 2 भागों में एक क्षेत्र विभाजन को परिभाषित करने की आवश्यकता होगी और यह एक नया struct बनाम का उपयोग कर इस का प्रतिनिधित्व करने के लिए बहुत आसान है एक 2 डी सर

struct Data { 
    public int Value; 
    public bool IsStart; 
} 

public static IEnumerable<Data> Split(this Region region) { 
    yield return new Data() { Value = region.StartLocation, IsStart=true}; 
    yield return new Data() { Value = region.EndLocation, IsStart=false}; 
} 

फिर आप उन्हें तोड़ने और उन्हें सॉर्ट करने के लिए निम्न LINQ क्वेरी का उपयोग कर सकते हैं।

List<Region> list = GetTheList(); 
var query = list 
    .SelectMany(x => x.Split()) 
    .OrderBy(x => x.Data); 
+0

यह एक अच्छा विचार की तरह लगता है। मुझे इसे आज़माएं और देखें कि क्या मेरे पास अब तेज़ है। धन्यवाद! – DarkAmgine

+1

यह क्यों नहीं है। चयन करें (x => x.Split())? – mquander

+0

यह दृष्टिकोण पैदा करता है (कोई इरादा नहीं है!) किसी फोरैच पर कोई लाभ नहीं है, और वास्तव में यहां उपयोग किए जाने वाले एकाधिक गणक के साथ अधिक ओवरहेड प्रस्तुत करता है। यह निश्चित रूप से चालाक है, लेकिन मैं इसे किसी भी तेज़ या अधिक पठनीय होने के रूप में नहीं देखता हूं। –

0

यह ऐसा समाधान नहीं है जो बौद्धिक अभ्यास के अलावा किसी अन्य चीज़ में LINQ के लिए उपयुक्त है। foreach लूप किसी भी cobbled-LINQ कार्यान्वयन के साथ बस तेज (वास्तव में तेजी से) होगा।

एक साइड नोट के रूप में, मुझे लगता है कि आप के बजाय foreach का उपयोग कर रहे हैं। यदि नहीं, तो आप foreach लूप पर स्विच करके अपनी प्रक्रिया को काफी तेज कर सकते हैं।

foreach(Region r in regionList) 
{ 
    // add your entries using r 
} 

तुलना में बहुत तेज हो जाएगा ..

for(int i = 0; i < regionList.Count; i++) 
{ 
    // add your entires using the indexer 
} 
+0

क्या कोई मुझे इस फोरैच/प्रदर्शन अंतर के लिए स्रोत पर इंगित कर सकता है? मैंने इसे कई स्थानों पर सुसमाचार के रूप में उद्धृत किया है, जिसमें कोई परीक्षण परिदृश्य नहीं है जिसे मैं चला सकता हूं। मेरे द्वारा चलाए गए प्रत्येक परीक्षण में गर्दन और गर्दन के दो तरीके होते हैं, एक सूची के साथ थोड़ा तेज़, एक सरणी के साथ थोड़ा तेज़, लेकिन हर कोई राय मानता है कि एक दूसरे की तुलना में काफी तेज़ है (हालांकि यह है लगता है अलग-अलग)। –

+0

डायनामिक रूप से आकार के संग्रह जैसे सूची के लिए फ़ोरैच तेज़ है क्योंकि सूची में इंडेक्सर किसी सरणी की तरह रिश्तेदार मेमोरी स्लॉट पर इंगित नहीं कर रहा है। एक सरणी पर सूचकांक तेज़ होता है क्योंकि इसमें एक गणनाकर्ता बनाने और प्रत्येक पुनरावृत्ति के साथ जांच करने के लिए (मामूली) ओवरहेड नहीं होता है। अपने परिदृश्य में वह एक सूची का उपयोग कर रहा है, इसलिए हाँ, एक foreach तेज होगा। –

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