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)。您需要将此代码放在它自己的静态类中。然后编译器将知道将第一个方法视为 Enumerable 类的扩展方法,因为第一个参数“this 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 窗口中看到 Permutations() 函数。

于 2013-11-13T12:19:44.550 回答