2012-02-01 9 views
5

संभव डुप्लिकेट:
Generating all Possible Combinationsएन-एन्यूमेरबल्स LINQ स्टेटमेंट में?

मुझे यकीन है कि नहीं कर रहा हूँ कैसे वाक्यांश सवाल करने के लिए; लेकिन मैं एक मूर्ख तर्क पहेली पर काम कर रहा था कि मैं LINQ कथन का उपयोग करके हल करने में सक्षम था। प्रासंगिक कोड इस तरह देखा:

(from myA in Enumerable.Range(1, 40) 
from myB in Enumerable.Range(1, 40) 
from myC in Enumerable.Range(1, 40) 
from myD in Enumerable.Range(1, 40) 
where myA + myB + myC + myD == 40 
    && myA <= myB 
    && myB <= myC 
    && myC <= myD 
select new[] {myA, myB, myC, myD}) 

तो यह मूल रूप से है कि कहाँ खंड में मानदंडों को पूरा ए, बी, सी डी के सभी संयोजनों पैदा कर रहा है।

जो मैं अभी करने की कोशिश कर रहा हूं वह इसे सामान्यीकृत कर रहा है, इसलिए मैं केवल चार की बजाय एन मानों के साथ एक ही चीज़ कर सकता हूं। उदाहरण के लिए, 3 मूल्यों के साथ - बराबर कोड होगा:

(from myA in Enumerable.Range(1, 40) 
from myB in Enumerable.Range(1, 40) 
from myC in Enumerable.Range(1, 40) 
where myA + myB + myC == 40 
    && myA <= myB 
    && myB <= myC 
select new[] {myA, myB, myC}) 

स्वाभाविक रूप से, मैं कोड को संशोधित नहीं करना चाहते - मैं एक समारोह है कि मैं फोन और एक पूर्णांक प्रदान करते हैं और यह सही वापसी की है सकते हैं वस्तु।

मैंने कुछ भ्रमित प्रयास किए हैं; लेकिन मैं वास्तव में ऐसा नहीं देख सकता कि ऐसा कुछ कैसे करें। क्या कोई मुझे सही दिशा दिखा सकता है?

+4

एरिक Lippert (http://blogs.msdn.com/b/ericlippert/archive/2010/06/28/computing-a-cartesian- [इस पर भी ब्लॉग] उत्पाद-साथ-linq.aspx) कई अनुक्रमों के उत्पादों की गणना करने के संबंध में। यह मदद कर सकता है। –

+0

@ एंथनी पेगम - यह सही है। वास्तव में मैं क्या देख रहा हूँ। यदि आप इसे उत्तर के रूप में पोस्ट करना चाहते हैं, तो मैं इसे स्वीकार करूंगा। –

+0

यह * मेरा * उत्तर नहीं है। ;) यदि आप क्रेडिट देना चाहते हैं तो क्रेडिट देना चाहते हैं, [यहां आज़माएं] (http://stackoverflow.com/a/3098381/414076) –

उत्तर

0

लिंक नहीं पढ़े हैं, और मुझे यकीन नहीं है कि यह भी सही दृष्टिकोण है, लेकिन कल्पना क्यों नहीं है कि हम गहराई के पेड़ पर चल रहे हैं जिसमें प्रत्येक नोड 40 (या 20 उदाहरण के रूप में है) बच्चे? यह इस तरह से तो दिखाई देगा,:

class Program { 
    static void Main(string[] args) { 
     Walk(3).Where(l => l.Sum() == 20 && 
      l.Skip(1).Where((num, i) => num < l[i]).Count() == 0) 
     .ToList().ForEach(l => Console.WriteLine(string.Join(" ", l))); 
     Console.ReadLine(); 
    } 

    static IEnumerable<List<int>> Walk(int depth) { 
     return depth == 0 ? 
      new[] { new List<int>()} : 
      Enumerable.Range(1,20).SelectMany(i => 
       Walk(depth - 1).Select(l => l.Concat(new[] {i}).ToList())); 
    } 
} 
संबंधित मुद्दे