0

私は、配列のすべての可能な順列を見つける必要があるプロジェクトに取り組んでいます。

私はこれをある程度まで機能させています

var geneticsArray = new[] { new[] { "M", "V" }, new[] { "M", "V" }};
var perms = from a in geneticsArray[0]
            from b in geneticsArray[1]

            select new { a, b };

これにより、すべてのオプションが表示されます。

  • んん
  • VM
  • MV
  • VV

これは正しいですが、私の意図と目的に関しては、VMとMVは同じものであるため、私が達成したいことではありません。

MVをVMに変換するにはどうすればよいですか?

この例は非常に単純で、2つのグループ化しか含まれていません。無限のグループ化が可能です。これについては後で扱いますが、返信が結果を単純に逆転させないように注意してください。

これに関するどんな助けも素晴らしいでしょう。

さらに編集

次のコードで、各順列の数を確認できます。

var permCounts = from perm in perms group perm by perm into b select new { b.Key, Count = b.Count() };

これにより、前述の各オプションが1回発生することがわかりますが、この場合、MVとMVのアウトラインは同じであるため、正しくありません。これを理解するためのコードが必要です。

これは私が探しているものであり、未知の数の組み合わせを処理できるようにする方法ではありません。

ありがとう

4

2 に答える 2

1

これはどう?

        var perms = from a in geneticsArray[0]
                    from b in geneticsArray[1]

                    select new string[] { a, b };

        var dict = new Dictionary<string, int>();
        foreach (var ent in perms)
        {
            Array.Sort(ent);
            var _ent = string.Join(",", ent);
            if (dict.ContainsKey(_ent))
            {
                dict[_ent]++;
            }
            else
            {
                dict.Add(_ent, 1);
            }
        }

        return dict;
于 2012-04-17T13:35:32.030 に答える
0

これは私たちをだまします:

var geneticsArray = new[] { new[] { "M", "V" }, new[] { "M", "V" } };
var perms = from a in geneticsArray[0]
            from b in geneticsArray[1]
            where a.CompareTo(b) >= 0
            select new { a, b };

また、再帰を使用してさまざまなサイズのリストを操作する方が簡単です(EricLippertによるこの投稿を参照してください-http ://ericlippert.com/2010/06/28/computing-a-cartesian-product-with-linq/)。

于 2012-04-17T12:12:30.067 に答える