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

2 に答える 2

3

IEnumerable プロパティを取得するだけです (例: listToPermutate):

var result = listToPermutate.Permutations();

using を静的クラスに手動で追加する必要があります。

于 2013-11-13T12:15:19.710 に答える
2

参考として、MSDN Extension Methods (C# Programming Guide)を確認してください。このコードを独自の静的クラスに配置する必要があります。コンパイラは、最初のパラメーター「this IEnumerable」により、最初のメソッドを Enumerable クラスの拡張メソッドとして扱うことを認識します。

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

次に、拡張機能を使用するコードで、「using MyExtensions」を追加して、拡張メソッドが存在する名前空間をインポートする必要があります。次に、次のように呼び出します

var resultList = list.Permutations();

正しくセットアップされていれば、入力を開始すると、Intelesense ウィンドウに Permutations() 関数が表示されることさえあります。

于 2013-11-13T12:19:44.550 に答える