2013-06-10 10 views
7

नियंत्रण संरचना लिखने का सबसे अच्छा तरीका क्या है जो सूची में प्रत्येक 2-तत्व संयोजन के माध्यम से पुनरावृत्त होगा?एक सूची में प्रत्येक तत्व की तुलना में प्रत्येक तत्व की तुलना

उदाहरण:

{0,1,2} 

मैं कोड रन में तीन बार के एक ब्लॉक करना चाहते हैं, इनमें से प्रत्येक पर एक बार:

{0,1} 
{1,2} 
{0,2} 

मैं निम्नलिखित

foreach (int i in input) 
{ 
    foreach (int j in input.Where(o => o != i)) 
    { 
     //Execute code 
    } 
} 

की कोशिश की लेकिन , यह तब काम नहीं करेगा जब एक सूची में दो तत्व होते हैं। साथ

{0,2,0} 

मैं अभी भी तत्वों 0 और 0 की तुलना करना चाहते हैं। मान अप्रासंगिक है।

+1

आप इनमें से प्रत्येक जोड़े के साथ क्या कर रहे हैं? आपका समाधान और जॉन के समाधान सभी ओ (एन वर्ग) हैं। आप जो कर रहे हैं उसके आधार पर ओ (एन) समाधान हो सकता है। (उदाहरण के लिए, सी # कंपाइलर में आपको अनन्य सर्वोत्तम विधि निर्धारित करने के लिए ओवरलोड रिज़ॉल्यूशन समस्या में विधियों की प्रत्येक जोड़ी की तुलना करने की आवश्यकता होती है; इसके लिए ओ (एन) एल्गोरिदम होता है, भले ही बेहतर-विधि संबंध अतुलनीय है।) –

उत्तर

21

ऐसा लगता है कि आप की तरह कुछ चाहते हो सकता है जैसे:

for (int i = 0; i < list.Count - 1; i++) 
{ 
    for (int j = i + 1; j < list.Count; j++) 
    { 
     // Use list[i] and list[j] 
    } 
} 

आप निश्चित रूप से LINQ के साथ ऐसा कर सकते हैं:

var pairs = from i in Enumerable.Range(0, list.Count - 1) 
      from j in Enumerable.Range(i + 1, list.Count - i) 
      select Tuple.Create(list[i], list[j]); 

मुझे यकीन है कि यह हालांकि किसी भी स्पष्ट है नहीं कर रहा हूँ ...

संपादित करें: एक और विकल्प जो कम कुशल है, लेकिन संभावित रूप से स्पष्ट है:

var pairs = from i in Enumerable.Range(0, list.Count - 1) 
      let x = list[i] 
      from y in list.Skip(i + 1) 
      select Tuple.Create(x, y); 
+0

बिल्कुल सही, मैंने कल्पना की तुलना में आसान तरीका। जब संभव हो मैं स्वीकार करूंगा। और धन्यवाद, लेकिन आप सही हैं, LINQ समाधान बहुत कम पठनीय है, और सबसे अधिक संभावना धीमी है। – Wilson

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