C#で順列を計算するコードをウェブから探してきた
C#で順列を計算するコードを探してきたのでメモしておく。
また、探すのは面倒なので。
@herara_ofnir3さんの拡張メソッドを利用したやり方は勉強させていただきました。
「独習C#」を以前に読んでいるときは素通りしてしまったが、改めて拡張メソッドの具体例に触れて錯覚かもしれないが少し理解ができたような気がした。
やはり具体例に触れるかどうかで理解度に差が出てしまう。
Gushwellさんの記事「Gushwell's C# Programming Page」からはリストから特定の要素を除く(Remove)ところや、ある要素を先頭に追加するところなどを参考にさせていただきました。
どちらも初心者には少々高度なので正しく理解しているかどうかは怪しいが、とてもではないがパクリでなければC言語で書くような泥臭いコードになっていたことだろう。日本語での情報空間があることに感謝。
using System;
using System.Collections.Generic;
using System.Linq;
static class Extensions
{
public static IEnumerable<IEnumerable<T>> Perm<T>(this IEnumerable<T> items, int? k = null)
{
if (k == null)
k = items.Count();
if (k == 0)
{
yield return Enumerable.Empty<T>();
}
else
{
foreach (var x in items)
{
var xs = items.ToList();
xs.Remove(x);
foreach (var c in Perm(xs, k - 1)){
var newelem = (new T {x}).Concat(c).ToArray();
yield return newelem;
}
}
}
}
}
class Program
{
static void Main(string args)
{
int n = 3;
var nums = Enumerable.Range(1, n).ToArray();
var permutation = nums.Perm();
int i = 1;
foreach (var elem in permutation) {
string s = string.Join(",", elem.Select(x => x.ToString()).ToArray());
Console.WriteLine("{0} : {1}", i++,s);
}
}
}
◎実行例
1 : 1,2,3
2 : 1,3,2
3 : 2,1,3
4 : 2,3,1
5 : 3,1,2
6 : 3,2,1
以上