2013-11-13 3 views
0

Я получил этот фрагмент из старого вопроса SO, но не имею идеи, как это реализовано. Я новичок в интерфейсах, так кто-то, пожалуйста, помогите?Метод расширения для перестановок

Я поместил его в статический класс, но я не знаю, как его называть, чтобы он мог генерировать набор перестановок.

public static IEnumerable<IEnumerable<T>> Permutations<T>(this IEnumerable<T> source) 
    { 
     if (source == null) 
      throw new ArgumentNullException("source"); 
     // Ensure that the source IEnumerable is evaluated only once 
     return permutations(source.ToArray()); 
    } 

    private static IEnumerable<IEnumerable<T>> permutations<T>(IEnumerable<T> source) 
    { 
     var c = source.Count(); 
     if (c == 1) 
      yield return source; 
     else 
      for (int i = 0; i < c; i++) 
       foreach (var p in permutations(source.Take(i).Concat(source.Skip(i + 1)))) 
        yield return source.Skip(i).Take(1).Concat(p); 
    } 
+0

Вы должны быть более конкретными в вопросе о том, чего вы действительно хотите. Вы хотите знать, как использовать этот метод? Или вы хотите уточнить некоторые детали его (их) внутреннего поведения? Или вы просто не уверены в определениях методов? – Agat

+0

Интерфейс не является сложным. Они содержат только список методов и/или полей. эти поля и методы не содержат никакого кода. Подумайте об этом как о шаблоне. когда вы создаете класс, если вы применяете интерфейс, вам будет предложено ввести в класс эти методы. – Franck

ответ

3

Просто возьмите IEnumerable свойство (например: listToPermutate):

var result = listToPermutate.Permutations(); 

Вы должны вручную добавить помощью к статическому классу.

+1

Можно также назвать это как статический метод: 'var result = YourStaticClass.Permutations (listToPermutate);' – Eugene

+0

- это действительно? Я не могу получить доступ к значению из результата после запуска метода. Я пытался var result = "BCDFGHJKLMNPQRSTVWXZY" .Permutations(); хотел получить доступ к перестановке с помощью результата [i]. это действительно? – TheJackal

+0

Вы не можете перебирать IEnumerable, как это. Вы должны преобразовать IEnumerable в фактическую коллекцию или список. – Loetn

2

В качестве справочного материала вы должны указать MSDN Extension Methods (C# Programming Guide). Вам нужно поместить этот код в свой собственный статический класс. Компилятор будет знать лечить первый метод как метод расширения для перечислимого класса из первого параметра «это IEnumerable»

using System; 
using System.Collections.Generic; 
using System.Linq; 

namespace MyExtensions 
{ 
    public static class EnumerableExtensions 
    { 

    public static IEnumerable<IEnumerable<T>> Permutations<T>(this IEnumerable<T> source) 
    { 
     if (source == null) 
     throw new ArgumentNullException("source"); 
     // Ensure that the source IEnumerable is evaluated only once 
     return permutations(source.ToArray()); 
    } 

    private static IEnumerable<IEnumerable<T>> permutations<T>(IEnumerable<T> source) 
    { 
     var c = source.Count(); 
     if (c == 1) 
     yield return source; 
     else 
     for (int i = 0; i < c; i++) 
      foreach (var p in permutations(source.Take(i).Concat(source.Skip(i + 1)))) 
       yield return source.Skip(i).Take(1).Concat(p); 
    } 
    } 
} 

Затем в коде вы хотите использовать расширение из, вам нужно добавить «использование MyExtensions» для импорта пространства имен, в котором существуют методы расширения. Тогда просто назвать это как

var resultList = list.Permutations(); 

Если у вас есть установка правильно, вы даже увидеть Перестановки() функцию в окне Intelesense, как вы начнете вводить его.

Смежные вопросы