1

3 つのグループごとにリストのすべての一意の順列を取得する方法を探していました。ダウンロードするソース コードと複雑なアルゴリズムがたくさん見つかりました。

私はついに、うまくいくと思われる独自のコードを思いつきました。以下が良い考えではない理由を誰か教えてください。私が見つけたすべての複雑な解決策のために見落としているものがあるに違いないと思いますが、私のものは単純すぎるようです。

var combinations = from a in Samples
                   from b in Samples
                   from c in Samples
                   where (string)a.sample != (string)b.sample 
                   && (string)a.sample != (string)c.sample 
                   && (string)b.sample != (string)c.sample 
                   select new Rank
                   {
                       sample = a.sample,
                       sampleb = b.sample,
                       samplec = c.sample 
                   };

foreach (var combo in combinations)
{
    string[] aut = { combo.sample, combo.sampleb, combo.samplec };
    Array.Sort(aut);
    combo.sample = aut[0];
    combo.sampleb = aut[1];
    combo.samplec = aut[2];
    l.Add(combo);
}

noDupes = from n in l
          group n by new { n.sample, n.sampleb, n.samplec } into g
          select new Rank
          {
              sample = g.Key.sample,
              sampleb = g.Key.sampleb,
              samplec = g.Key.samplec
          };
4

1 に答える 1

1

すべてを追加してから、重複を削除します。必要はありません。順列に関するこの(私の)回答を参照してください:https://stackoverflow.com/a/9315076/360211

シナリオに当てはめると、3 桁の数字 ( maxDigits = 3) があります。base = Samples.Count()

コードが既に機能している場合、このアプローチの利点はパフォーマンス関連のみです。

于 2013-09-25T12:31:38.647 に答える