2017-03-16 13 views
1

配列をループしてすべての組み合わせを取得しようとしていますが、3段階後に停止する必要があります。どのようなこれまでのところすべての配列の組み合わせ、3つのレベルで停止C#

Service1, Service2, Serivce3 
Service1, Service2, Serivce4 
Service1, Service3, Serivce2 
Service1, Service3, Serivce4 
Service1, Service4, Serivce2 
Service1, Service4, Serivce3 

Service2, Service1, Serivce3 
Service2, Service1, Serivce4 
Service2, Service3, Serivce1 
Service2, Service3, Serivce4 
Service2, Service4, Serivce3 
Service2, Service4, Serivce1 

Service3, Service1, Serivce2 
Service3, Service1, Serivce4 
Service3, Service2, Serivce1 
Service3, Service2, Serivce4 
Service3, Service4, Serivce2 
Service3, Service4, Serivce1 

Service4, Service2, Serivce3 
Service4, Service2, Serivce1 
Service4, Service3, Serivce2 
Service4, Service3, Serivce1 
Service4, Service1, Serivce2 
Service4, Service1, Serivce3 
:たとえば:

String[] arr = ["Service1", "Service2", "Service3", "Service4"]; 

これは、アレイ内のつ以上が存在することは可能ですが、この例から、私は以下の組み合わせを生成できるようにしたいと思います私はこれらの結果を私に与えないように努力して研究しました。あなたが提供できる援助に感謝します。

+1

'*私はこれらの結果を得られません*' - あなたのコードはどのような結果をもたらしましたか? –

+2

[so]はフリーコード作成サービスではありません。 **あなた自身でコードを書くことを試みることが期待されます**。 [もっと研究をして](http://meta.stackoverflow.com/questions/261592)問題がある場合は**あなたが試したことを投稿することができます** **動作していないことの明確な説明**を提供し、[**最小、完全、および検証可能な例**](http://stackoverflow.com/help/mcve)。私は良い質問と[完璧な質問]を読むことをお勧めします(http://codeblog.jonskeet.uk/2010/08/29/writing-the-perfect-question/)。また、[ツアー]も必ず行ってください。 – Igor

+3

明らかに、注文事項( 'Service3、Service4、Service2'と' Service4、Service2、Serivce3'は別々の結果です)、ここであなたが言及しているのは通常、* Combinations *ではなく* Permutations * (組み合わせは順列に似ていますが、順序は関係ありません)。あなたはそれを使用してグーグルグーグル運が良いかもしれません。 –

答えて

1

あなたはthis library from CodeProjectを取ると、この例のようにコンビネーションクラスを使用することができます。ここでは

char[] inputSet = { 'A', 'B', 'C', 'D' }; 

var combinations = new Combinations<char>(inputSet, 3); 
var cformat = "Combinations of {{A B C D}} choose 3: size = {0}"; 
Console.WriteLine(String.Format(cformat, combinations.Count)); 

foreach(var combination in combinations) 
{ 
    Console.WriteLine(String.Join(", ", combination); 
} 
+0

これは完全に機能しました。ありがとうございました! – Scott

+0

この回答は間違っています。少なくとも、OPはそれを尋ねました。それは '{A B C}、{A B D}、{A C D}、 {B C D}'を出力します。つまり、4は3 = 4の結果を選択します。 OPが24の結果のリストを掲示したので、明らかにここでの注文は重要です。代わりに 'Variations'クラスを使用してください(コピー/貼り付けするコードのすぐ下のセクション)。 –

0

偶然、私は昨日、コードチャレンジとしてプログラムを書いたfinds all permutations of a string with a given length.私は重複を削除することに注意してください。 "ポップ"には3つあります! = 6文字配列であるが、「p」は2回繰り返されて区別できないので、3!/ 2 = 3(すなわち、「opp」、「pop」、「ppo」)。

static HashSet<string> outputSet = new HashSet<string>(); 

     // this function will find all the strings of length k you can make from a set of letters N 
     // e.g. "pop" --> pop, ppo, opp 
     static void permuteSetLength(string prefix, string suffix, int length) 
     { 
      if (length == 0) 
      { 
       outputSet.Add(prefix); 
       return; 
      } 

      // use dictionary to remove duplicate prefixes, to avoid permuting the same thing again 
      Dictionary<string, string> newPrefixesAndSuffixes = new Dictionary<string, string>(); 
      // otherwise, calculate our new prefixes by adding each letter of suffix to the prefix, and decrementing length by 1 
      for (int i = 0; i < suffix.Length; i++) 
      { 
       if (!newPrefixesAndSuffixes.ContainsKey(prefix + suffix[i])) // new key 
       { 
        // remove ith character from suffix and add it to prefix 
        permuteSetLength(prefix + suffix[i], suffix.Substring(0,i) + suffix.Substring(i+1), length - 1); 
       } 

      } 
     } 

これはあなたの出発点になるはずです。文字列(つまり文字配列)の並び替えと文字列配列の置換を見つけることの関係を見ることができます。

コールそうのようなコード:

ABC、ABD、ACB、ACD、ADB、ADC、BAC、悪い、BCA、BCD、BDA:

permuteSetLength("", "abcd", 3); 
string[] outputArray = new string[outputSet.Count]; 
outputSet.CopyTo(outputArray); 
Console.WriteLine(String.Join(",", outputArray)); 

それは次のように出力します予想されるとおりに24、BDC、タクシー、CAD、CBA、CBD、CDA、CDB、DAB、DAC、DBA、DBC、DCA、DCB

数、すなわち4×3×2 = 24、。それぞれの文字を文字列にマップするのは簡単なはずですが、代わりにメソッド自体を変更することをお勧めします。

0

は別のソリューションです:

var strings = new[] { "a", "b", "c", "d" }; 
var combinations = (
from s1 in strings 
from s2 in strings.Where(s => s != s1) 
from s3 in strings.Where(s => s != s2 && s != s1) 
select new { s1, s2, s3 }).Distinct(); 

foreach (var c in combinations) 
{ 
    Console.WriteLine($"{c.s1}{c.s2}{c.s3}"); 
} 

おそらく、コードを研磨もう少し、それすることができ働く

希望は役立ちます。

+0

'Console.WriteLine($" {c.s1} {c.s2} {c.s3} ");}という行は、コンパイルされないので、問題があります。 –

+1

使用しているC#のバージョンによって異なります。 – MaKCbIMKo

+0

ああ、私の間違い。私は最新のC#のバージョンに追いついていない...私はまだ仕事でVisual Studio 2010を持っています。 :O –

関連する問題