2013-03-01 57 views
8

Tôi muốn để có thể tham gia một danh sách như thế nàyTất cả các hoán vị của một danh sách

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

Và có được một kết quả như thế này

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} 
    }; 

Tôi không quan tâm đến bộ với thiếu số, chỉ là sự kết hợp của các con số tồn tại. Bất kỳ ý tưởng?


Ngoài ra, tôi đã xem xét các giải pháp như Getting all possible combinations from a list of numbers và chúng không phù hợp.

Đó là một mang lại cho tôi một cái gì đó như thế này

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. 
    }; 

Và nó không nhổ ra tất cả các kết hợp.


+6

Những gì bạn đang muốn tìm tất cả các _Permutations_ danh sách của bạn. Điều này đã được hỏi nhiều lần ở đây trước đây :) Đây là một câu hỏi rất giống nhau: http://stackoverflow.com/questions/3319586/getting-all-possible-permutations-from-a-list-of-numbers –

+2

Kết quả đó không không bao gồm tất cả các mục và nó bao gồm các hoán vị loại trừ các mục. Đã thử cả hai và không phù hợp. Tôi đã không thể tìm thấy bất kỳ loại ví dụ làm việc nào không hoạt động giống như ví dụ bạn đã liên kết. –

+0

Các bản sao được xử lý như thế nào? Điều gì sẽ xảy ra nếu bạn được cung cấp '0, 1, 1, 1, 2, 2'? – yoozer8

Trả lời

7

Hãy thử những phương pháp khuyến nông trên cho kích thước:

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

Vâng, tôi nghĩ bạn thắng. –

Các vấn đề liên quan