2013-03-01 8 views
8

मैं इसएक सूची के सभी क्रमपरिवर्तन

var result= 
    new List<List<int>>{ 
     new List<int>{0, 1, 2}, 
     new List<int>{0, 2, 1}, 
     new List<int>{1, 0, 2}, 
     new List<int>{1, 2, 0}, 
     new List<int>{2, 0, 1}, 
     new List<int>{2, 1, 0} 
    }; 

की तरह इस

var list=new List<int>{0, 1, 2}; 

की तरह एक सूची ले और एक परिणाम प्राप्त करने में सक्षम होना चाहते हैं मुझे याद आ रही के साथ सेट में कोई दिलचस्पी नहीं हूँ संख्याएं, मौजूद संख्याओं के संयोजन। कोई विचार?


इसके अलावा, मैं Getting all possible combinations from a list of numbers तरह समाधान में पहले से ही देखा है, और वे फिट नहीं है।

भी मुझे इस

var result= 
    new List<List<int>> { 
     // [[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]] 
     // serialized the result to JSON so it would be quicker. 
    }; 

की तरह कुछ देता है कि और यह संयोजनों के सभी थूक से बाहर नहीं है।


+6

क्या आप देख रहे हैं सब अपनी सूची के _Permutations_ है। यह पहले यहां बहुत बार पूछा गया था :) यहां एक बहुत ही समान प्रश्न है: http://stackoverflow.com/questions/3319586/getting-all-possible-permutations-from-a-list-of-numbers –

+2

परिणामस्वरूप नहीं होता सभी वस्तुओं को शामिल नहीं करते हैं, और इसमें क्रमिकता शामिल है जो आइटम को बहिष्कृत करती है। उन्हें दोनों की कोशिश की और न ही फिट। मैं किसी भी प्रकार का कामकाजी उदाहरण नहीं ढूंढ पा रहा हूं जो आपके द्वारा लिंक किए गए जैसा काम नहीं करता है। –

+0

डुप्लीकेट कैसे प्रबंधित किए जाते हैं? क्या होगा यदि आपको '0, 1, 1, 1, 2, 2' दिया गया था? – yoozer8

उत्तर

7

आकार के लिए पर इन विस्तार तरीकों का प्रयास करें:

public static IEnumerable<IEnumerable<T>> Permute<T>(this IEnumerable<T> sequence) 
{ 
    if (sequence == null) 
    { 
     yield break; 
    } 

    var list = sequence.ToList(); 

    if (!list.Any()) 
    { 
     yield return Enumerable.Empty<T>(); 
    } 
    else 
    { 
     var startingElementIndex = 0; 

     foreach (var startingElement in list) 
     { 
      var remainingItems = list.AllExcept(startingElementIndex); 

      foreach (var permutationOfRemainder in remainingItems.Permute()) 
      { 
       yield return startingElement.Concat(permutationOfRemainder); 
      } 

      startingElementIndex++; 
     } 
    } 
} 

private static IEnumerable<T> Concat<T>(this T firstElement, IEnumerable<T> secondSequence) 
{ 
    yield return firstElement; 
    if (secondSequence == null) 
    { 
     yield break; 
    } 

    foreach (var item in secondSequence) 
    { 
     yield return item; 
    } 
} 

private static IEnumerable<T> AllExcept<T>(this IEnumerable<T> sequence, int indexToSkip) 
{ 
    if (sequence == null) 
    { 
     yield break; 
    } 

    var index = 0; 

    foreach (var item in sequence.Where(item => index++ != indexToSkip)) 
    { 
     yield return item; 
    } 
} 
+2

हाँ, मुझे लगता है कि आप जीतते हैं। –

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